From 20b36d179b988b4536151ad3213191739fdcb7e0 Mon Sep 17 00:00:00 2001 From: Paco Gomez Date: Sat, 1 Nov 2025 00:31:46 +0100 Subject: [PATCH 1/3] New front end --- bigdata_briefs/api/app.py | 1 + .../static/fonts/HankenGrotesk-Bold.ttf | Bin 0 -> 66508 bytes .../static/fonts/HankenGrotesk-Italic.ttf | Bin 0 -> 71036 bytes .../static/fonts/HankenGrotesk-Regular.ttf | Bin 0 -> 66576 bytes .../static/scripts/company_browser.js | 213 ++++++ bigdata_briefs/static/scripts/config_panel.js | 50 ++ bigdata_briefs/static/scripts/csv_upload.js | 31 + bigdata_briefs/static/scripts/form.js | 446 ++++++++---- bigdata_briefs/static/scripts/load_example.js | 136 +++- .../static/scripts/report_renderer.js | 275 +++----- .../static/scripts/tab_controller.js | 78 +++ .../static/scripts/topics_selector.js | 128 +++- .../static/scripts/visualization.js | 87 ++- bigdata_briefs/templates/api/base.html.jinja | 129 +++- bigdata_briefs/templates/api/index.html.jinja | 660 +++++++++++++----- 15 files changed, 1607 insertions(+), 627 deletions(-) create mode 100644 bigdata_briefs/static/fonts/HankenGrotesk-Bold.ttf create mode 100644 bigdata_briefs/static/fonts/HankenGrotesk-Italic.ttf create mode 100644 bigdata_briefs/static/fonts/HankenGrotesk-Regular.ttf create mode 100644 bigdata_briefs/static/scripts/company_browser.js create mode 100644 bigdata_briefs/static/scripts/config_panel.js create mode 100644 bigdata_briefs/static/scripts/csv_upload.js create mode 100644 bigdata_briefs/static/scripts/tab_controller.js diff --git a/bigdata_briefs/api/app.py b/bigdata_briefs/api/app.py index 7376735..d464108 100644 --- a/bigdata_briefs/api/app.py +++ b/bigdata_briefs/api/app.py @@ -129,6 +129,7 @@ async def sample_frontend(_: str = Security(query_scheme)) -> HTMLResponse: sources=example_values["sources"], example_watchlists=list(dict(ExampleWatchlists).values()), example_request_id=str(EXAMPLE_UUID), + version=__version__, ), media_type="text/html", ) diff --git a/bigdata_briefs/static/fonts/HankenGrotesk-Bold.ttf b/bigdata_briefs/static/fonts/HankenGrotesk-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..654c4653cbf2f78fb55f5a0aebe11523ea3a88f9 GIT binary patch literal 66508 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 aAqeuOHn%h7q}?D&JnV+s{ug(!?EeCd#7YzZ literal 0 HcmV?d00001 diff --git a/bigdata_briefs/static/fonts/HankenGrotesk-Italic.ttf b/bigdata_briefs/static/fonts/HankenGrotesk-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..fb0b658acc771134d684bbbd7fadffa942740a51 GIT binary patch literal 71036 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
  • U_Jq;;J4!?L90> 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 literal 0 HcmV?d00001 diff --git a/bigdata_briefs/static/scripts/company_browser.js b/bigdata_briefs/static/scripts/company_browser.js new file mode 100644 index 0000000..d2b373d --- /dev/null +++ b/bigdata_briefs/static/scripts/company_browser.js @@ -0,0 +1,213 @@ +// Company Browser - Handles browsing and searching through company reports + +class CompanyBrowser { + constructor() { + this.companies = []; + this.filteredCompanies = []; + this.searchTerm = ''; + this.expandedCompany = null; + } + + init(companyReports) { + this.companies = companyReports || []; + this.filteredCompanies = [...this.companies]; + this.render(); + } + + filter(searchTerm) { + this.searchTerm = searchTerm.toLowerCase().trim(); + + if (!this.searchTerm) { + this.filteredCompanies = [...this.companies]; + } else { + this.filteredCompanies = this.companies.filter(company => { + const name = (company.entity_info?.name || '').toLowerCase(); + const ticker = (company.entity_info?.ticker || '').toLowerCase(); + const sector = (company.entity_info?.sector || '').toLowerCase(); + const entityId = (company.entity_id || '').toLowerCase(); + + return name.includes(this.searchTerm) || + ticker.includes(this.searchTerm) || + sector.includes(this.searchTerm) || + entityId.includes(this.searchTerm); + }); + } + + this.render(); + } + + toggleCompany(entityId) { + if (this.expandedCompany === entityId) { + this.expandedCompany = null; + } else { + this.expandedCompany = entityId; + } + this.render(); + } + + render() { + const container = document.querySelector('[data-tab-content="companies"] .tab-actual-content'); + if (!container) return; + + // Create search bar + let searchHtml = ` +
    +
    + + + + +
    +
    + Showing ${this.filteredCompanies.length} of ${this.companies.length} companies +
    +
    + `; + + // Create company list + if (this.filteredCompanies.length === 0) { + searchHtml += ` +
    +

    No companies found matching "${this.searchTerm}"

    +
    + `; + } else { + searchHtml += '
    '; + + this.filteredCompanies.forEach(company => { + const entityId = company.entity_id; + const entityInfo = company.entity_info || {}; + const name = entityInfo.name || 'Unknown Company'; + const ticker = entityInfo.ticker || 'N/A'; + const sector = entityInfo.sector || 'N/A'; + const bulletCount = (company.content || []).length; + const isExpanded = this.expandedCompany === entityId; + + searchHtml += ` +
    + + + ${isExpanded ? this.renderCompanyDetails(company) : ''} +
    + `; + }); + + searchHtml += '
    '; + } + + container.innerHTML = searchHtml; + } + + renderCompanyDetails(company) { + const entityInfo = company.entity_info || {}; + const bulletPoints = company.content || []; + + let html = ` +
    +
    +

    Company Information

    +
    + `; + + // Display all available entity info fields + for (const [key, value] of Object.entries(entityInfo)) { + if (value !== null && value !== undefined && value !== '') { + html += ` +
    + ${this.formatKey(key)}: + ${this.escapeHtml(String(value))} +
    + `; + } + } + + html += ` +
    +
    + +
    +

    Report Bullet Points

    +
    + `; + + if (bulletPoints.length === 0) { + html += '

    No bullet points available for this company.

    '; + } else { + bulletPoints.forEach((bullet, index) => { + const bulletText = bullet.bullet_point || ''; + const sources = bullet.sources || []; + + html += ` +
    +
    + ${index + 1}. +
    +

    ${this.escapeHtml(bulletText)}

    + ${sources.length > 0 ? ` +
    +

    Sources:

    +
    + ${sources.map(source => ` + + ${this.escapeHtml(source)} + + `).join('')} +
    +
    + ` : ''} +
    +
    +
    + `; + }); + } + + html += ` +
    +
    +
    + `; + + return html; + } + + formatKey(key) { + // Convert snake_case or camelCase to Title Case + return key + .replace(/_/g, ' ') + .replace(/([A-Z])/g, ' $1') + .replace(/^./, str => str.toUpperCase()) + .trim(); + } + + escapeHtml(text) { + if (text === null || text === undefined) return ''; + const div = document.createElement('div'); + div.textContent = text; + return div.innerHTML; + } +} + +// Initialize company browser +window.companyBrowser = new CompanyBrowser(); + diff --git a/bigdata_briefs/static/scripts/config_panel.js b/bigdata_briefs/static/scripts/config_panel.js new file mode 100644 index 0000000..64c7c19 --- /dev/null +++ b/bigdata_briefs/static/scripts/config_panel.js @@ -0,0 +1,50 @@ +// Configuration Panel - Sliding Side Panel + +function toggleConfigPanel() { + const panel = document.getElementById('configPanel'); + const backdrop = document.getElementById('configBackdrop'); + + if (panel && backdrop) { + const isOpen = !panel.classList.contains('translate-x-full'); + + if (isOpen) { + // Close + panel.classList.add('translate-x-full'); + backdrop.classList.add('hidden'); + backdrop.classList.remove('opacity-100'); + } else { + // Open + panel.classList.remove('translate-x-full'); + backdrop.classList.remove('hidden'); + setTimeout(() => backdrop.classList.add('opacity-100'), 10); + } + } +} + +function closeConfigPanel() { + const panel = document.getElementById('configPanel'); + const backdrop = document.getElementById('configBackdrop'); + + if (panel && backdrop) { + panel.classList.add('translate-x-full'); + backdrop.classList.add('hidden'); + backdrop.classList.remove('opacity-100'); + } +} + +// Make functions globally available +window.toggleConfigPanel = toggleConfigPanel; +window.closeConfigPanel = closeConfigPanel; + +// Close panel when clicking backdrop +document.addEventListener('DOMContentLoaded', function() { + const backdrop = document.getElementById('configBackdrop'); + if (backdrop) { + backdrop.addEventListener('click', function(e) { + if (e.target === backdrop) { + closeConfigPanel(); + } + }); + } +}); + diff --git a/bigdata_briefs/static/scripts/csv_upload.js b/bigdata_briefs/static/scripts/csv_upload.js new file mode 100644 index 0000000..95ac2cf --- /dev/null +++ b/bigdata_briefs/static/scripts/csv_upload.js @@ -0,0 +1,31 @@ +// CSV Upload Handler - Additional utility functions if needed + +// Validate CSV entities format +function validateCsvEntities(entities) { + // Basic validation: check if entities are non-empty strings + return entities.filter(entity => entity && entity.trim().length > 0); +} + +// Export entities for use in form submission +function getCsvEntities() { + return window.csvEntities || []; +} + +// Clear CSV upload +function clearCsvUpload() { + window.csvEntities = []; + const fileInput = document.getElementById('csvFile'); + if (fileInput) { + fileInput.value = ''; + } + const preview = document.getElementById('csvPreview'); + if (preview) { + preview.classList.add('hidden'); + } +} + +// Make functions globally available +window.validateCsvEntities = validateCsvEntities; +window.getCsvEntities = getCsvEntities; +window.clearCsvUpload = clearCsvUpload; + diff --git a/bigdata_briefs/static/scripts/form.js b/bigdata_briefs/static/scripts/form.js index 0ef1a9f..ee02a4c 100644 --- a/bigdata_briefs/static/scripts/form.js +++ b/bigdata_briefs/static/scripts/form.js @@ -1,168 +1,320 @@ -document.getElementById('briefForm').onsubmit = async function (e) { - e.preventDefault(); - const output = document.getElementById('output'); - const spinner = document.getElementById('spinner'); - const showJsonBtn = document.getElementById('showJsonBtn'); - const submitBtn = document.querySelector('button[type="submit"]'); - output.innerHTML = ''; - output.classList.remove('error'); - showJsonBtn.style.display = 'none'; - lastReport = null; - - // Disable the submit button - submitBtn.disabled = true; - submitBtn.textContent = 'Waiting for response...'; - - // Get companies and check if its available in the watchlists - let companies = document.getElementById('companies_text').value.trim(); - const foundWatchlist = watchlists.find(w => w.name === companies); - if (foundWatchlist) { - companies = foundWatchlist.id; - } - else if (!companies) { - output.innerHTML = `❌ Error: Company Universe is required.`; - output.classList.add('error'); - submitBtn.disabled = false; - submitBtn.textContent = 'Generate Brief'; - return; - } - const start_date = document.getElementById('start_date').value; - const end_date = document.getElementById('end_date').value; +// Form submission handler +document.addEventListener('DOMContentLoaded', function() { + const briefForm = document.getElementById('briefForm'); + if (!briefForm) return; + + briefForm.onsubmit = async function (e) { + e.preventDefault(); + + const spinner = document.getElementById('spinner'); + const submitBtn = document.querySelector('button[type="submit"]'); + const logViewer = document.getElementById('logViewer'); - const llm_model = document.getElementById('llm_model').value.trim(); + // Close config panel + if (window.closeConfigPanel) { + closeConfigPanel(); + } - // Build request payload - let payload = { - }; - - // Use topic_sentences array if it exists and has content, otherwise fall back to topics input field - let topicsArray = []; - if (typeof topic_sentences !== 'undefined' && topic_sentences.length > 0) { - topicsArray = topic_sentences; - } - - if (topicsArray.length > 0) { - // Validate that ALL topics contain the {company} placeholder - const topicsWithoutPlaceholder = topicsArray.filter(topic => !topic.includes('{company}')); - if (topicsWithoutPlaceholder.length > 0) { - const failingTopicsList = topicsWithoutPlaceholder.map(topic => `• ${escapeHtml(topic)}`).join('
    '); - output.innerHTML = `❌ Error: The following topics are missing the {company} placeholder:
    ${failingTopicsList}
    `; - output.classList.add('error'); - submitBtn.disabled = false; - submitBtn.textContent = 'Generate Brief'; + // Hide empty state and show dashboard + const emptyState = document.getElementById('emptyState'); + const dashboardSection = document.getElementById('dashboardSection'); + if (emptyState) emptyState.style.display = 'none'; + if (dashboardSection) dashboardSection.classList.remove('hidden'); + + // Clear previous results + window.lastReport = null; + const overviewContent = document.querySelector('[data-tab-content="overview"] .tab-actual-content'); + const companiesContent = document.querySelector('[data-tab-content="companies"] .tab-actual-content'); + if (overviewContent) overviewContent.innerHTML = ''; + if (companiesContent) companiesContent.innerHTML = ''; + + // Show loading indicators + document.querySelectorAll('.loading-indicator').forEach(indicator => { + indicator.classList.remove('hidden'); + }); + + // Disable submit button + submitBtn.disabled = true; + submitBtn.innerHTML = ` +
    + Generating... + `; + + // Show spinner + if (spinner) spinner.classList.remove('hidden'); + + // Open logs + const logViewerContainer = document.getElementById('logViewerContainer'); + if (logViewerContainer && logViewerContainer.classList.contains('hidden')) { + toggleProcessLogs(); + } + + if (logViewer) logViewer.innerHTML = '
    Starting brief generation...
    '; + + // Get companies based on selected input method + let companies = null; + if (currentCompanyInputMethod === 'watchlist') { + const companiesText = document.getElementById('companies_text')?.value.trim(); + const foundWatchlist = watchlists.find(w => w.name === companiesText); + if (foundWatchlist) { + companies = foundWatchlist.id; + } else if (companiesText) { + // Could be a watchlist ID + companies = companiesText; + } + } else if (currentCompanyInputMethod === 'csv') { + const csvEntities = window.csvEntities || []; + if (csvEntities.length > 0) { + companies = csvEntities; + } + } else if (currentCompanyInputMethod === 'manual') { + const manualInput = document.getElementById('companies_manual')?.value.trim(); + if (manualInput) { + companies = manualInput.split(',').map(s => s.trim()).filter(Boolean); + } + } + + if (!companies || (Array.isArray(companies) && companies.length === 0)) { + showError('Company Universe is required. Please select a watchlist, upload a CSV, or enter entity IDs manually.'); + resetFormState(); return; } - payload.topics = topicsArray; - } - const novelty = document.getElementById('novelty').value === 'true'; - let sources = document.getElementById('sources').value.trim(); - if (sources) { - if (sources.includes(',')) { - payload.sources = sources.split(',').map(s => s.trim()).filter(Boolean); - // A single RP Entity ID + const start_date = document.getElementById('start_date')?.value; + const end_date = document.getElementById('end_date')?.value; + + if (!start_date || !end_date) { + showError('Start date and end date are required.'); + resetFormState(); + return; } - else { - payload.sources = [sources]; + + // Build request payload + let payload = { + companies: companies, + report_start_date: start_date, + report_end_date: end_date + }; + + // Topics + if (typeof topic_sentences !== 'undefined' && topic_sentences && topic_sentences.length > 0) { + // Validate that ALL topics contain the {company} placeholder + const topicsWithoutPlaceholder = topic_sentences.filter(topic => !topic.includes('{company}')); + if (topicsWithoutPlaceholder.length > 0) { + const failingTopicsList = topicsWithoutPlaceholder.map(topic => `• ${escapeHtml(topic)}`).join('
    '); + showError(`The following topics are missing the {company} placeholder:
    ${failingTopicsList}`); + resetFormState(); + return; + } + payload.topics = topic_sentences; + } + + // Novelty + const novelty = document.getElementById('novelty')?.checked || false; + payload.novelty = novelty; + + // Sources + const sourcesInput = document.getElementById('sources')?.value.trim(); + if (sourcesInput) { + payload.sources = sourcesInput.split(',').map(s => s.trim()).filter(Boolean); + } + + // Source Rank Boost + const sourceRankBoost = document.getElementById('source_rank_boost')?.value; + if (sourceRankBoost && sourceRankBoost !== '') { + const value = parseInt(sourceRankBoost); + if (!isNaN(value) && value >= 0 && value <= 10) { + payload.source_rank_boost = value; + } + } + + // Freshness Boost + const freshnessBoost = document.getElementById('freshness_boost')?.value; + if (freshnessBoost && freshnessBoost !== '') { + const value = parseInt(freshnessBoost); + if (!isNaN(value) && value >= 0 && value <= 10) { + payload.freshness_boost = value; + } } - } - // A list of companies - if (companies.includes(',')) { - payload.companies = companies.split(',').map(s => s.trim()).filter(Boolean); - // A single RP Entity ID - } else if (companies.length === 6) { - payload.companies = [companies]; - // A watchlist ID - } else if (companies.length > 6) { - payload.companies = companies; - } + // Include Title and Summary (for future backend support) + const includeTitleSummary = document.getElementById('includeTitleSummary')?.checked; + // Store for future use when backend supports it + // payload.include_title_summary = includeTitleSummary; + + // Update header info + updateHeaderInfo(start_date, end_date, companies); + + // Add token from URL param if present + const params = new URLSearchParams(); + const token = getUrlParam('token'); + if (token) { + params.append("token", token); + } - if (start_date) payload.report_start_date = start_date; - if (end_date) payload.report_end_date = end_date; - if (novelty) payload.novelty = novelty; + try { + const response = await fetch(`/briefs/create?${params}`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(payload) + }); + + if (!response.ok) { + const errorData = await response.json().catch(() => ({})); + throw new Error(errorData.detail || `HTTP error ${response.status}`); + } + + const data = await response.json(); + + // Start polling status endpoint + if (data && data.request_id) { + const requestId = data.request_id; + pollStatus(requestId, params, submitBtn, spinner); + } else { + throw new Error('No request_id received from server'); + } + } catch (err) { + showError(`Error: ${err.message}`); + resetFormState(); + } + }; +}); - // Add token from URL param if present - const params = new URLSearchParams(); - const token = getUrlParam('token'); - if (token) { - params.append("token", token); +function showError(message) { + const overviewContent = document.querySelector('[data-tab-content="overview"] .tab-actual-content'); + if (overviewContent) { + overviewContent.innerHTML = ` +
    +

    ${message}

    +
    + `; } + document.querySelectorAll('.loading-indicator').forEach(indicator => { + indicator.classList.add('hidden'); + }); +} - try { - const response = await fetch(`/briefs/create?${params}`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(payload) - }); - if (!response.ok) { - throw new Error(`HTTP error ${response.status}`); +function resetFormState() { + const submitBtn = document.querySelector('button[type="submit"]'); + const spinner = document.getElementById('spinner'); + + if (submitBtn) { + submitBtn.disabled = false; + submitBtn.innerHTML = ` + + + + + Generate Brief + `; + } + if (spinner) spinner.classList.add('hidden'); +} + +function updateHeaderInfo(startDate, endDate, companies) { + const dateRangeEl = document.getElementById('currentDateRange'); + const companiesEl = document.getElementById('currentCompanies'); + + if (dateRangeEl) { + const start = new Date(startDate).toLocaleDateString(); + const end = new Date(endDate).toLocaleDateString(); + dateRangeEl.textContent = `${start} - ${end}`; + } + + if (companiesEl) { + if (Array.isArray(companies)) { + companiesEl.textContent = `${companies.length} companies`; + } else { + const watchlist = watchlists.find(w => w.id === companies); + companiesEl.textContent = watchlist ? watchlist.name : 'Custom'; } - const data = await response.json(); - // Start polling status endpoint every 5 seconds using request_id - if (data && data.request_id) { - const requestId = data.request_id; - let polling = true; - const logViewer = document.getElementById('logViewer'); - async function pollStatus() { - - try { - const statusResp = await fetch(`/briefs/status/${requestId}?${params}`); - if (!statusResp.ok) { - throw new Error(`Status HTTP error ${statusResp.status}`); - } - const statusData = await statusResp.json(); - spinner.style.display = 'block'; - // Render logs if available - if (statusData.logs && Array.isArray(statusData.logs)) { - logViewer.innerHTML = statusData.logs.map(line => { - let base = 'mb-1'; - let color = ''; - if (line.toLowerCase().includes('error')) color = 'text-red-400'; - else if (line.toLowerCase().includes('success')) color = 'text-green-400'; - else if (line.toLowerCase().includes('info')) color = 'text-sky-400'; - return `
    ${line}
    `; - }).join(''); - logViewer.scrollTop = logViewer.scrollHeight; - } else if (statusData.log) { - logViewer.textContent = statusData.log; - } else { - logViewer.textContent = 'No logs yet.'; - } - // Stop polling if status is 'completed' or 'failed' - if (statusData.status === 'completed' || statusData.status === 'failed') { - polling = false; - if (statusData.status === 'completed') { - output.innerHTML = renderBriefReport(statusData.report) - showJsonBtn.style.display = 'inline-block'; - lastReport = statusData.report; - } - spinner.style.display = 'none'; - submitBtn.disabled = false; - submitBtn.textContent = 'Generate Brief'; - return; + } +} + +async function pollStatus(requestId, params, submitBtn, spinner) { + const logViewer = document.getElementById('logViewer'); + let polling = true; + + async function poll() { + try { + const statusResp = await fetch(`/briefs/status/${requestId}?${params}`); + if (!statusResp.ok) { + throw new Error(`Status HTTP error ${statusResp.status}`); + } + + const statusData = await statusResp.json(); + + // Render logs if available + if (logViewer && statusData.logs && Array.isArray(statusData.logs)) { + logViewer.innerHTML = statusData.logs.map(line => { + let color = 'text-zinc-300'; + if (line.toLowerCase().includes('error')) color = 'text-red-400'; + else if (line.toLowerCase().includes('success') || line.toLowerCase().includes('complete')) color = 'text-green-400'; + else if (line.toLowerCase().includes('info')) color = 'text-blue-400'; + return `
    ${escapeHtml(line)}
    `; + }).join(''); + logViewer.scrollTop = logViewer.scrollHeight; + } + + // Stop polling if status is 'completed' or 'failed' + if (statusData.status === 'completed' || statusData.status === 'failed') { + polling = false; + + if (statusData.status === 'completed' && statusData.report) { + // Hide loading indicators + document.querySelectorAll('.loading-indicator').forEach(indicator => { + indicator.classList.add('hidden'); + }); + + // Render the report + if (window.renderBriefReport) { + renderBriefReport(statusData.report); } - } catch (err) { - logViewer.innerHTML = `
    ❌ Status Error: ${err.message}
    `; + window.lastReport = statusData.report; + } else if (statusData.status === 'failed') { + showError('Brief generation failed. Check logs for details.'); } - if (polling) { - setTimeout(pollStatus, 5000); + + if (spinner) spinner.classList.add('hidden'); + if (submitBtn) { + submitBtn.disabled = false; + submitBtn.innerHTML = ` + + + + + Generate Brief + `; } + return; + } + } catch (err) { + if (logViewer) { + logViewer.innerHTML += `
    ❌ Status Error: ${escapeHtml(err.message)}
    `; } - pollStatus(); } - } catch (err) { - output.innerHTML = `❌ Error: ${err.message}`; - output.classList.add('error'); - submitBtn.disabled = false; - submitBtn.textContent = 'Generate Brief'; - spinner.style.display = 'none'; + + if (polling) { + setTimeout(poll, 5000); + } } -}; + + poll(); +} -document.getElementById('showJsonBtn').onclick = function () { - if (lastReport) { - document.getElementById('jsonContent').textContent = JSON.stringify(lastReport, null, 2); - document.getElementById('jsonModal').style.display = 'block'; +// Show JSON button handler +document.addEventListener('DOMContentLoaded', function() { + const showJsonBtn = document.getElementById('showJsonBtn'); + if (showJsonBtn) { + showJsonBtn.onclick = function () { + if (window.lastReport) { + const jsonContent = document.getElementById('jsonContent'); + const jsonModal = document.getElementById('jsonModal'); + if (jsonContent && jsonModal) { + jsonContent.textContent = JSON.stringify(window.lastReport, null, 2); + jsonModal.classList.remove('hidden'); + } + } + }; } -}; \ No newline at end of file +}); diff --git a/bigdata_briefs/static/scripts/load_example.js b/bigdata_briefs/static/scripts/load_example.js index e2b7baf..92ff939 100644 --- a/bigdata_briefs/static/scripts/load_example.js +++ b/bigdata_briefs/static/scripts/load_example.js @@ -1,43 +1,119 @@ // Load Example function that accepts requestId as parameter async function loadRequestId(requestId) { - // Load example data into the form - // Add token from URL param if present - const showJsonBtn = document.getElementById('showJsonBtn'); - showJsonBtn.style.display = 'none'; - lastReport = null; + // Hide empty state and show dashboard + const emptyState = document.getElementById('emptyState'); + const dashboardSection = document.getElementById('dashboardSection'); + if (emptyState) emptyState.style.display = 'none'; + if (dashboardSection) dashboardSection.classList.remove('hidden'); + + // Clear previous results + window.lastReport = null; + const overviewContent = document.querySelector('[data-tab-content="overview"] .tab-actual-content'); + const companiesContent = document.querySelector('[data-tab-content="companies"] .tab-actual-content'); + if (overviewContent) overviewContent.innerHTML = ''; + if (companiesContent) companiesContent.innerHTML = ''; + + // Show loading indicators + document.querySelectorAll('.loading-indicator').forEach(indicator => { + indicator.classList.remove('hidden'); + }); + // Add token from URL param if present const params = new URLSearchParams(); const token = getUrlParam('token'); if (token) { params.append("token", token); } + const logViewer = document.getElementById('logViewer'); + const logViewerContainer = document.getElementById('logViewerContainer'); + + // Open logs + if (logViewerContainer && logViewerContainer.classList.contains('hidden')) { + toggleProcessLogs(); + } + + try { + const statusResp = await fetch(`/briefs/status/${requestId}?${params}`); + if (!statusResp.ok) { + throw new Error(`Status HTTP error ${statusResp.status}`); + } + + const statusData = await statusResp.json(); + + // Render logs if available + if (logViewer && statusData.logs && Array.isArray(statusData.logs)) { + logViewer.innerHTML = statusData.logs.map(line => { + let color = 'text-zinc-300'; + if (line.toLowerCase().includes('error')) color = 'text-red-400'; + else if (line.toLowerCase().includes('success') || line.toLowerCase().includes('complete')) color = 'text-green-400'; + else if (line.toLowerCase().includes('info')) color = 'text-blue-400'; + return `
    ${escapeHtml(line)}
    `; + }).join(''); + logViewer.scrollTop = logViewer.scrollHeight; + } else if (logViewer && statusData.log) { + logViewer.textContent = statusData.log; + } else if (logViewer) { + logViewer.textContent = 'No logs available.'; + } + + // Render report if completed + if (statusData.status === 'completed' && statusData.report) { + // Hide loading indicators + document.querySelectorAll('.loading-indicator').forEach(indicator => { + indicator.classList.add('hidden'); + }); - const statusResp = await fetch(`/briefs/status/${requestId}?${params}`); - if (!statusResp.ok) { - throw new Error(`Status HTTP error ${statusResp.status}`); + // Update header info + const report = statusData.report; + updateHeaderInfo( + report.start_date, + report.end_date, + report.watchlist_name || report.watchlist_id + ); + + // Render the report using the new renderer + if (window.renderBriefReport) { + window.renderBriefReport(report); + } + + window.lastReport = report; + } else if (statusData.status === 'failed') { + showError('Failed to load example. The brief generation may have failed.'); + } + } catch (err) { + showError(`Error loading example: ${err.message}`); } - const statusData = await statusResp.json(); - // Render logs if available - if (statusData.logs && Array.isArray(statusData.logs)) { - logViewer.innerHTML = statusData.logs.map(line => { - let base = 'mb-1'; - let color = ''; - if (line.toLowerCase().includes('error')) color = 'text-red-400'; - else if (line.toLowerCase().includes('success')) color = 'text-green-400'; - else if (line.toLowerCase().includes('info')) color = 'text-sky-400'; - return `
    ${line}
    `; - }).join(''); - logViewer.scrollTop = logViewer.scrollHeight; - } else if (statusData.log) { - logViewer.textContent = statusData.log; - } else { - logViewer.textContent = 'No logs yet.'; +} + +function updateHeaderInfo(startDate, endDate, companies) { + const dateRangeEl = document.getElementById('currentDateRange'); + const companiesEl = document.getElementById('currentCompanies'); + + if (dateRangeEl && startDate && endDate) { + const start = new Date(startDate).toLocaleDateString(); + const end = new Date(endDate).toLocaleDateString(); + dateRangeEl.textContent = `${start} - ${end}`; } - // Stop polling if status is 'completed' or 'failed' - if (statusData.status === 'completed') { - output.innerHTML = renderBriefReport(statusData.report) - showJsonBtn.style.display = 'inline-block'; - lastReport = statusData.report; + + if (companiesEl && companies) { + companiesEl.textContent = typeof companies === 'string' ? companies : 'Multiple companies'; } -}; \ No newline at end of file +} + +function showError(message) { + const overviewContent = document.querySelector('[data-tab-content="overview"] .tab-actual-content'); + if (overviewContent) { + overviewContent.innerHTML = ` +
    +

    ${escapeHtml(message)}

    +
    + `; + } + document.querySelectorAll('.loading-indicator').forEach(indicator => { + indicator.classList.add('hidden'); + }); +} + +// Make function globally available +window.loadRequestId = loadRequestId; diff --git a/bigdata_briefs/static/scripts/report_renderer.js b/bigdata_briefs/static/scripts/report_renderer.js index e37a4e6..b74a9ce 100644 --- a/bigdata_briefs/static/scripts/report_renderer.js +++ b/bigdata_briefs/static/scripts/report_renderer.js @@ -1,22 +1,4 @@ -function toggleHighlights(button) { - const highlights = button.closest('.highlights'); - const isCollapsed = highlights.classList.contains('collapsed'); - const extraItems = highlights.querySelectorAll('.extra'); - - if (isCollapsed) { - highlights.classList.remove('collapsed'); - extraItems.forEach(item => { - item.classList.remove('hidden'); - }); - button.textContent = 'Show Less'; - } else { - highlights.classList.add('collapsed'); - extraItems.forEach(item => { - item.classList.add('hidden'); - }); - button.textContent = 'Show More'; - } -} +// Report Renderer - Handles rendering brief reports in tabbed interface function formatIntroduction(text) { if (!text) return ''; @@ -34,196 +16,101 @@ function formatIntroduction(text) { } function renderBriefReport(data) { - if (!data || typeof data !== 'object') return 'No data to display.'; + if (!data || typeof data !== 'object') { + showError('No data to display.'); + return; + } + + // Hide loading indicators + document.querySelectorAll('.loading-indicator').forEach(indicator => { + indicator.classList.add('hidden'); + }); + + // Render Overview tab + renderOverviewTab(data); + + // Render Company Reports tab + renderCompanyReportsTab(data); +} + +function renderOverviewTab(data) { + const overviewContent = document.querySelector('[data-tab-content="overview"] .tab-actual-content'); + if (!overviewContent) return; let html = ''; - // Header section with watchlist badge and date range - html += '
    '; - html += `
    - - ${escapeHtml(data.watchlist_name || data.watchlist_id)} - - 📅 - ${escapeHtml(data.end_date)} + // Watchlist and date info + html += '
    '; + html += `
    + ${escapeHtml(data.watchlist_name || data.watchlist_id || 'Unknown Watchlist')}
    `; - - html += `
    - - + html += `
    + Period: ${escapeHtml(data.start_date || '')} to ${escapeHtml(data.end_date || '')}
    `; + html += '
    '; // Title - html += `

    ${escapeHtml(data.report_title)}

    `; - html += '
    '; + if (data.report_title) { + html += `
    +

    ${escapeHtml(data.report_title)}

    +
    `; + } // Introduction section if (data.introduction) { - html += `
    -

    - Highlights + html += `
    +

    + + + + Summary

    -
    +
    ${formatIntroduction(data.introduction)}
    `; + } else { + html += `
    +

    No summary available for this brief.

    +
    `; } - // Entity reports as cards - if (Array.isArray(data.entity_reports) && data.entity_reports.length > 0) { - html += '
    '; - - data.entity_reports.forEach(entity => { - const entityName = (entity.entity_info && (entity.entity_info.name || entity.entity_info.id)) - ? escapeHtml(entity.entity_info.name || entity.entity_info.id) - : escapeHtml(entity.entity_id); - - // Extract entity metadata if available - const ticker = entity.entity_info?.ticker || entity.entity_info?.symbol || ''; - const country = entity.entity_info?.country || entity.entity_info?.location || ''; - const industry = entity.entity_info?.industry || entity.entity_info?.sector || ''; - - const highlights = Array.isArray(entity.content) ? entity.content : []; - - // Build card: Changed to a dark, blurred background with refined padding and borders. - html += `
    `; - - // Company header section - html += '
    '; - // Updated typography for the entity name. - html += `
    ${entityName}
    `; - - html += '
    '; - if (ticker) { - // Polished ticker style. - html += `${escapeHtml(ticker)}`; - } - if (country) { - // Replaced emoji with a cleaner SVG icon. - html += ` - ${escapeHtml(country)} - `; - } - if (industry) { - // Polished industry tag style. - html += `${escapeHtml(industry)}`; - } - html += '
    '; - html += '
    '; - - // Divider for better separation. - html += '
    '; - - // Highlights section - if (highlights.length > 0) { - const hasMore = highlights.length > 2; - html += `
    `; - - highlights.forEach((bp, i) => { - const isExtra = i >= 2; - // Updated highlight box style to match the dark theme. - html += `
    `; - html += `

    `; // Set base text color for highlights. - - // Source indicator with a restyled tooltip for the dark theme. - if (Array.isArray(bp.sources) && bp.sources.length > 0) { - let tooltipContent = ''; - - // Define SVG icons for a cleaner look (Heroicons) - const iconSource = ``; - const iconTitle = ``; - const iconUrl = ``; - - bp.sources.forEach((sourceId, sourceIndex) => { - // Use optional chaining and provide a default empty object for robustness - const sourceMetadata = data.source_metadata?.[sourceId] || {}; - - // Destructure properties with default values - const { - text = "No text available", - headline = 'No headline available', - source_name: sourceName = 'Unknown Source', - url - } = sourceMetadata; - - // Use a container for each source to handle spacing, removing the need for


    - // This creates a more modern, card-based layout - tooltipContent += ` -
    `; - - if (sourceName !== 'Unknown Source') { - tooltipContent += ` -
    - ${iconSource} - ${escapeHtml(sourceName)} -
    -
    -
    -
    ${iconTitle}
    - ${escapeHtml(text)} -
    `; - - if (url) { - tooltipContent += ` -
    -
    ${iconUrl}
    - - ${escapeHtml(url)} - -
    `; - } - tooltipContent += `
    `; // Closes space-y-2 - } else { - // A styled fallback for sources without metadata - tooltipContent += ` -
    - Source reference: ${escapeHtml(sourceId)} -
    `; - } - - tooltipContent += `
    `; // Closes the main container div - }); - - html += `
    - ${bp.sources.length} - -
    `; - } - - html += renderBoldText(escapeHtml(bp.bullet_point)); - html += '

    '; - }); - - // "Show More" button with updated styling. - if (hasMore) { - html += ``; - } - - html += '
    '; - } else { - html += '

    No highlights available.

    '; - } - - html += '
    '; // End of card - }); - - html += '
    '; // End of grid + // Additional metadata if available + if (data.novelty !== undefined) { + html += `
    + Novelty filter: ${data.novelty ? 'Enabled' : 'Disabled'} +
    `; + } + + overviewContent.innerHTML = html; +} + +function renderCompanyReportsTab(data) { + const companiesContent = document.querySelector('[data-tab-content="companies"] .tab-actual-content'); + if (!companiesContent) return; + + // Use the company browser to render companies + if (window.companyBrowser && Array.isArray(data.entity_reports) && data.entity_reports.length > 0) { + window.companyBrowser.init(data.entity_reports); } else { - html += '

    No entity reports available.

    '; + companiesContent.innerHTML = ` +
    +

    No company reports available.

    +
    + `; + } +} + +function showError(message) { + const overviewContent = document.querySelector('[data-tab-content="overview"] .tab-actual-content'); + if (overviewContent) { + overviewContent.innerHTML = ` +
    +

    ${escapeHtml(message)}

    +
    + `; } - // Add custom styles for collapsed state - html += ``; - - return html; -}; \ No newline at end of file +} + +// Make function globally available +window.renderBriefReport = renderBriefReport; diff --git a/bigdata_briefs/static/scripts/tab_controller.js b/bigdata_briefs/static/scripts/tab_controller.js new file mode 100644 index 0000000..4a2a5ec --- /dev/null +++ b/bigdata_briefs/static/scripts/tab_controller.js @@ -0,0 +1,78 @@ +// Tab Controller - Manages tab navigation similar to risk analyzer + +class TabController { + constructor() { + this.currentTab = 'overview'; + this.tabs = []; + } + + init() { + // Get all tab buttons + this.tabs = document.querySelectorAll('[data-tab]'); + + // Add click handlers + this.tabs.forEach(tab => { + tab.addEventListener('click', (e) => { + const tabName = e.currentTarget.getAttribute('data-tab'); + this.switchTab(tabName); + }); + }); + + // Set initial tab + if (this.tabs.length > 0) { + const initialTab = this.tabs[0].getAttribute('data-tab'); + this.switchTab(initialTab); + } + } + + switchTab(tabName) { + this.currentTab = tabName; + + // Update tab buttons + this.tabs.forEach(tab => { + const tabId = tab.getAttribute('data-tab'); + if (tabId === tabName) { + // Active tab + tab.classList.remove('border-transparent', 'text-zinc-400', 'hover:text-zinc-200'); + tab.classList.add('border-blue-500', 'text-blue-400', 'bg-blue-500/10'); + } else { + // Inactive tab + tab.classList.remove('border-blue-500', 'text-blue-400', 'bg-blue-500/10'); + tab.classList.add('border-transparent', 'text-zinc-400', 'hover:text-zinc-200'); + } + }); + + // Update tab content + const tabContents = document.querySelectorAll('[data-tab-content]'); + tabContents.forEach(content => { + const contentId = content.getAttribute('data-tab-content'); + if (contentId === tabName) { + content.classList.remove('hidden'); + } else { + content.classList.add('hidden'); + } + }); + + // Trigger custom event for tab change + const event = new CustomEvent('tabChanged', { detail: { tab: tabName } }); + document.dispatchEvent(event); + } + + reset() { + if (this.tabs.length > 0) { + const firstTab = this.tabs[0].getAttribute('data-tab'); + this.switchTab(firstTab); + } + } + + getCurrentTab() { + return this.currentTab; + } +} + +// Initialize tab controller when DOM is ready +window.tabController = new TabController(); +document.addEventListener('DOMContentLoaded', function() { + window.tabController.init(); +}); + diff --git a/bigdata_briefs/static/scripts/topics_selector.js b/bigdata_briefs/static/scripts/topics_selector.js index 1bd6b01..771853b 100644 --- a/bigdata_briefs/static/scripts/topics_selector.js +++ b/bigdata_briefs/static/scripts/topics_selector.js @@ -1,3 +1,70 @@ +// Topic Presets +const TOPIC_PRESETS = { + finance: [ + "What key takeaways emerged from {company}'s latest earnings report?", + "What notable changes in {company}'s financial performance metrics have been reported recently?", + "Has {company} revised its financial or operational guidance for upcoming periods?", + "What significant strategic initiatives or business pivots has {company} announced recently?", + "What material acquisition, merger, or divestiture activities involve {company} currently?", + "What executive leadership changes have been announced at {company} recently?", + "What significant contract wins, losses, or renewals has {company} recently announced?", + "What significant new product launches or pipeline developments has {company} announced?", + "What material operational disruptions or capacity changes is {company} experiencing currently?", + "How are supply chain conditions affecting {company}'s operations and outlook?", + "What production milestones or efficiency improvements has {company} achieved recently?", + "What cost-cutting measures or expense management initiatives has {company} recently disclosed?", + "What notable market share shifts has {company} experienced recently?", + "How is {company} responding to new competitive threats or significant competitor actions?", + "What significant new product launches or pipeline developments has {company} announced?", + "What specific regulatory developments are materially affecting {company}?", + "How are current macroeconomic factors affecting {company}'s performance and outlook?", + "What material litigation developments involve {company} currently?", + "What industry-specific trends or disruptions are directly affecting {company}?", + "What significant capital allocation decisions has {company} announced recently?", + "What changes to dividends, buybacks, or other shareholder return programs has {company} announced?", + "What debt issuance, refinancing, or covenant changes has {company} recently announced?", + "Have there been any credit rating actions or outlook changes for {company} recently?", + "What shifts in the prevailing narrative around {company} are emerging among influential investors?", + "What significant events could impact {company}'s performance in the near term?", + "What unexpected disclosures or unusual trading patterns has {company} experienced recently?", + "Is there any activist investor involvement or significant shareholder actions affecting {company}?" + ], + all: [ + "What are the most important developments for {company}?" + ], + esg: [ + "What environmental initiatives or sustainability goals has {company} announced or achieved?", + "What climate-related risks or opportunities is {company} facing?", + "How is {company} managing its carbon footprint and environmental impact?", + "What social responsibility initiatives or community engagement programs has {company} launched?", + "What diversity, equity, and inclusion efforts has {company} implemented?", + "What labor practices, employee relations, or workplace safety issues affect {company}?", + "What governance changes, board composition updates, or executive compensation changes has {company} made?", + "What ethical concerns, controversies, or compliance issues involve {company}?", + "What ESG-related regulations or standards is {company} responding to?", + "What stakeholder engagement or ESG reporting updates has {company} provided?" + ], + custom: [] +}; + +// Handle topic preset changes +function handleTopicPresetChange() { + const presetSelect = document.getElementById('topicPreset'); + const selectedPreset = presetSelect.value; + + if (selectedPreset === 'custom') { + // Keep current topics + return; + } + + // Load preset topics + if (TOPIC_PRESETS[selectedPreset]) { + topic_sentences = [...TOPIC_PRESETS[selectedPreset]]; + renderSentences(); + } +} +window.handleTopicPresetChange = handleTopicPresetChange; + document.addEventListener('DOMContentLoaded', () => { const form = document.getElementById('add-form'); const addButton = document.getElementById('add-button'); @@ -9,11 +76,12 @@ document.addEventListener('DOMContentLoaded', () => { // Function to render the list of topic_sentences const renderSentences = () => { // Clear the current list to avoid duplicates + if (!listContainer) return; listContainer.innerHTML = ''; // If there are no topic_sentences, display a message - if (topic_sentences.length === 0) { - listContainer.innerHTML = `

    No keyword lines added yet.

    `; + if (!topic_sentences || topic_sentences.length === 0) { + listContainer.innerHTML = `

    No topics added yet. Add a topic above.

    `; return; } @@ -24,17 +92,18 @@ document.addEventListener('DOMContentLoaded', () => { // Create the main container for the list item const listItem = document.createElement('div'); - listItem.className = 'flex justify-between items-center bg-white p-4 border border-gray-200 rounded-md shadow-sm text-xs'; + listItem.className = 'flex justify-between items-center bg-zinc-900/50 p-3 border border-zinc-700 rounded-lg text-sm'; // Create the text element const sentenceText = document.createElement('span'); sentenceText.textContent = sentence; - sentenceText.className = 'text-gray-700'; + sentenceText.className = 'text-zinc-300 flex-1 mr-3'; // Create the delete button const deleteButton = document.createElement('button'); deleteButton.textContent = 'Delete'; - deleteButton.className = 'bg-red-500 text-white font-semibold px-4 py-1 rounded-md hover:bg-red-600 transition-colors'; + deleteButton.type = 'button'; + deleteButton.className = 'bg-red-600/80 text-white font-medium px-3 py-1.5 rounded-md hover:bg-red-600 transition-colors text-xs'; // Add an event listener to the delete button deleteButton.addEventListener('click', () => { @@ -52,11 +121,26 @@ document.addEventListener('DOMContentLoaded', () => { // Function to add a new sentence const addSentence = () => { + if (!input) return; const newSentence = input.value.trim(); // Get value and remove whitespace if (newSentence) { // Only add if the input is not empty + // Validate that it contains {company} + if (!newSentence.includes('{company}')) { + alert('Topic must include {company} placeholder'); + return; + } + if (!topic_sentences) { + topic_sentences = []; + } topic_sentences.push(newSentence); input.value = ''; // Clear the input field renderSentences(); // Re-render the list + + // Switch to custom preset if not already + const presetSelect = document.getElementById('topicPreset'); + if (presetSelect && presetSelect.value !== 'custom') { + presetSelect.value = 'custom'; + } } }; @@ -67,21 +151,35 @@ document.addEventListener('DOMContentLoaded', () => { renderSentences(); // Re-render the list }; + // Make renderSentences available globally + window.renderSentences = renderSentences; + // --- EVENT LISTENERS --- // Listen for form submission (e.g., pressing Enter) - form.addEventListener('submit', (event) => { - event.preventDefault(); // Prevent page reload - addSentence(); - }); + if (form) { + form.addEventListener('submit', (event) => { + event.preventDefault(); // Prevent page reload + addSentence(); + }); + } // Listen for clicks on the add button - addButton.addEventListener('click', (event) => { - event.preventDefault(); // Prevent form submission - addSentence(); - }); + if (addButton) { + addButton.addEventListener('click', (event) => { + event.preventDefault(); // Prevent form submission + addSentence(); + }); + } // --- INITIAL RENDER --- // Render the initial list when the page loads - renderSentences(); -}); \ No newline at end of file + if (listContainer) { + renderSentences(); + } +}); + +// Make topic_sentences accessible globally +if (typeof topic_sentences === 'undefined') { + window.topic_sentences = []; +} diff --git a/bigdata_briefs/static/scripts/visualization.js b/bigdata_briefs/static/scripts/visualization.js index 6607d36..27d8674 100644 --- a/bigdata_briefs/static/scripts/visualization.js +++ b/bigdata_briefs/static/scripts/visualization.js @@ -1,56 +1,73 @@ // Info modal content for each label const infoContents = { topics: `Topics:
    Specify the topics you want to analyze. Each topic must include the {company} placeholder which will be replaced with actual company names during analysis. You can specify multiple topics, one per line.
    Examples: "What key takeaways emerged from {company}'s latest earnings report?"`, - companies: `Company Universe:
    The portfolio of companies you want to create the brief for. You have several input options:
    • Select one of the public watchlists using the dropdown menu
    • Write list of RavenPack entity IDs (e.g., 4A6F00, D8442A)
    • Input a watchlist ID (e.g., 44118802-9104-4265-b97a-2e6d88d74893 )

    Watchlists can be created programmatically using the Bigdata.com SDK or through the Bigdata app.`, - start_date: `Start/End Date:
    The start and end of the time sample during which you want to generate the brief. Format: YYYY-MM-DD.`, - novelty: 'Novelty:
    If set to true, the analysis will focus on novel events that have not been widely reported before, helping to identify emerging risks. If false, all relevant events will be considered, including those that have been frequently reported.', - sources: `Sources:
    Optionally, you can filter the analysis to include only events from specific sources. You can provide a list of RavenPack entity IDs separated by commas (e.g., 9D69F1, B5235B). If left empty, events from all sources will be considered.`, + companies: `Company Universe:
    The portfolio of companies you want to create the brief for. You have several input options:
    • Select one of the public watchlists using the dropdown menu
    • Upload a CSV file with RavenPack entity IDs (one per line)
    • Manually enter a list of RavenPack entity IDs separated by commas (e.g., 4A6F00, D8442A)
    • Input a watchlist ID (e.g., 44118802-9104-4265-b97a-2e6d88d74893)

    Watchlists can be created programmatically using the Bigdata.com SDK or through the Bigdata app.`, + start_date: `Start Date:
    The start of the time period for which you want to generate the brief. Format: YYYY-MM-DD.`, + end_date: `End Date:
    The end of the time period for which you want to generate the brief. Format: YYYY-MM-DD.`, + novelty: 'Novelty Filter:
    If enabled, the brief will focus on novel information that has not been included in previously generated briefs. This helps avoid redundant content and highlights new developments.', + sources: `Sources:
    Optionally, you can filter the brief to include only events from specific sources. You can provide a list of RavenPack entity IDs separated by commas (e.g., 9D69F1, B5235B). If left empty, events from all sources will be considered.`, + source_rank_boost: `Source Rank Boost (0-10):
    Controls how much the source rank influences relevance. Set to 0 to ignore source rank, or up to 10 for maximum effect, boosting chunks from premium sources.`, + freshness_boost: `Freshness Boost (0-10):
    Controls the influence of document timestamp on relevance. Set to 0 to ignore publishing time (useful for point-in-time research), or up to 10 to heavily prioritize the most recent documents.`, + includeTitleSummary: `Include Title and Summary:
    When enabled, the brief will include a title and introduction/summary section. This feature is currently being prepared for backend support.`, load_example: `Load Example:
    By clicking this button you will load an example output that is preloaded. By using it you can get an idea of the type of output you can expect from this workflow without waiting. The input data for the example is:

    Start date: 2025-10-01 00:00:00
    End date: 2025-10-07 00:00:00
    Topics: Default topics list
    `, }; -document.addEventListener('DOMContentLoaded', function () { - const dragbar = document.getElementById('dragbar'); - const sidebar = document.getElementById('sidebar'); - const outputarea = document.getElementById('outputarea'); - let dragging = false; +// Toggle advanced options +function toggleAdvancedOptions() { + const adv = document.getElementById('advanced-options'); + const btnIcon = document.getElementById('advancedOptionsIcon'); + if (!adv || !btnIcon) return; + + if (adv.classList.contains('hidden')) { + adv.classList.remove('hidden'); + btnIcon.style.transform = 'rotate(180deg)'; + } else { + adv.classList.add('hidden'); + btnIcon.style.transform = 'rotate(0deg)'; + } +} - dragbar.addEventListener('mousedown', function (e) { - dragging = true; - document.body.classList.add('cursor-ew-resize'); - document.body.style.userSelect = 'none'; - }); +// Make function globally available +window.toggleAdvancedOptions = toggleAdvancedOptions; - document.addEventListener('mousemove', function (e) { - if (!dragging) return; - const minSidebar = 250; - const maxSidebar = 600; - let newWidth = Math.min(Math.max(e.clientX - sidebar.getBoundingClientRect().left, minSidebar), maxSidebar); - sidebar.style.width = newWidth + 'px'; - // outputarea will flex to fill remaining space - }); +// Toggle process logs +function toggleProcessLogs() { + const container = document.getElementById('logViewerContainer'); + const icon = document.getElementById('logsIcon'); + if (!container || !icon) return; + + if (container.classList.contains('hidden')) { + container.classList.remove('hidden'); + icon.style.transform = 'rotate(180deg)'; + } else { + container.classList.add('hidden'); + icon.style.transform = 'rotate(0deg)'; + } +} - document.addEventListener('mouseup', function (e) { - if (dragging) { - dragging = false; - document.body.classList.remove('cursor-ew-resize'); - document.body.style.userSelect = ''; - } - }); -}); +window.toggleProcessLogs = toggleProcessLogs; function showInfoModal(label) { let container = document.getElementById('infoModalsContainer'); + const content = infoContents[label] || 'No info available.'; container.innerHTML = ` -
    -
    - -
    ${infoContents[label] || 'No info available.'}
    -
    For a complete list of parameters and their descriptions, refer to the API documentation.
    +
    +
    + +
    ${content}
    +
    For a complete list of parameters and their descriptions, refer to the API documentation.
    `; } +// Make function globally available +window.showInfoModal = showInfoModal; + function showDocumentModal(document_id) { let container = document.getElementById('infoModalsContainer'); container.innerHTML = ` diff --git a/bigdata_briefs/templates/api/base.html.jinja b/bigdata_briefs/templates/api/base.html.jinja index 7bf67d7..1a4c9f8 100644 --- a/bigdata_briefs/templates/api/base.html.jinja +++ b/bigdata_briefs/templates/api/base.html.jinja @@ -4,15 +4,89 @@ Bigdata Research Services + - - - - + + + - - -