import apiClient from './apiClient.js'; class DatasetsModelsView { constructor(section) { this.section = section; this.datasetsBody = section.querySelector('[data-datasets-body]'); this.modelsBody = section.querySelector('[data-models-body]'); this.previewButton = section.querySelector('[data-preview-dataset]'); this.previewModal = section.querySelector('[data-dataset-modal]'); this.previewContent = section.querySelector('[data-dataset-modal-content]'); this.closePreview = section.querySelector('[data-close-dataset-modal]'); this.modelTestForm = section.querySelector('[data-model-test-form]'); this.modelTestOutput = section.querySelector('[data-model-test-output]'); this.datasets = []; this.models = []; } async init() { await Promise.all([this.loadDatasets(), this.loadModels()]); this.bindEvents(); } bindEvents() { if (this.closePreview) { this.closePreview.addEventListener('click', () => this.toggleModal(false)); } if (this.previewModal) { this.previewModal.addEventListener('click', (event) => { if (event.target === this.previewModal) this.toggleModal(false); }); } if (this.modelTestForm && this.modelTestOutput) { this.modelTestForm.addEventListener('submit', async (event) => { event.preventDefault(); const formData = new FormData(this.modelTestForm); this.modelTestOutput.innerHTML = '

Sending prompt to model...

'; const result = await apiClient.testModel({ model: formData.get('model'), text: formData.get('input'), }); if (!result.ok) { this.modelTestOutput.innerHTML = `
${result.error}
`; return; } this.modelTestOutput.innerHTML = `
${JSON.stringify(result.data, null, 2)}
`; }); } } async loadDatasets() { if (!this.datasetsBody) return; const result = await apiClient.getDatasetsList(); if (!result.ok) { this.datasetsBody.innerHTML = `${result.error}`; return; } this.datasets = result.data || []; this.datasetsBody.innerHTML = this.datasets .map( (dataset) => ` ${dataset.name} ${dataset.type || '—'} ${dataset.updated_at || dataset.last_updated || '—'} `, ) .join(''); this.section.querySelectorAll('button[data-dataset]').forEach((button) => { button.addEventListener('click', () => this.previewDataset(button.dataset.dataset)); }); } async previewDataset(name) { if (!name) return; this.toggleModal(true); this.previewContent.innerHTML = `

Loading ${name} sample...

`; const result = await apiClient.getDatasetSample(name); if (!result.ok) { this.previewContent.innerHTML = `
${result.error}
`; return; } const rows = result.data || []; if (!rows.length) { this.previewContent.innerHTML = '

No sample rows available.

'; return; } const headers = Object.keys(rows[0]); this.previewContent.innerHTML = ` ${headers.map((h) => ``).join('')} ${rows .map((row) => `${headers.map((h) => ``).join('')}`) .join('')}
${h}
${row[h]}
`; } toggleModal(state) { if (!this.previewModal) return; this.previewModal.classList.toggle('active', state); } async loadModels() { if (!this.modelsBody) return; const result = await apiClient.getModelsList(); if (!result.ok) { this.modelsBody.innerHTML = `${result.error}`; return; } this.models = result.data || []; this.modelsBody.innerHTML = this.models .map( (model) => ` ${model.name} ${model.task || '—'} ${model.status || '—'} ${model.description || ''} `, ) .join(''); const modelSelect = this.section.querySelector('[data-model-select]'); if (modelSelect) { modelSelect.innerHTML = this.models.map((m) => ``).join(''); } } } export default DatasetsModelsView;