Datasourceforcryptocurrency / static /js /datasetsModelsView.js
Really-amin's picture
Upload 196 files
dd7ffbd verified
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 = '<p>Sending prompt to model...</p>';
const result = await apiClient.testModel({
model: formData.get('model'),
text: formData.get('input'),
});
if (!result.ok) {
this.modelTestOutput.innerHTML = `<div class="inline-message inline-error">${result.error}</div>`;
return;
}
this.modelTestOutput.innerHTML = `<pre>${JSON.stringify(result.data, null, 2)}</pre>`;
});
}
}
async loadDatasets() {
if (!this.datasetsBody) return;
const result = await apiClient.getDatasetsList();
if (!result.ok) {
this.datasetsBody.innerHTML = `<tr><td colspan="4">${result.error}</td></tr>`;
return;
}
this.datasets = result.data || [];
this.datasetsBody.innerHTML = this.datasets
.map(
(dataset) => `
<tr>
<td>${dataset.name}</td>
<td>${dataset.type || 'β€”'}</td>
<td>${dataset.updated_at || dataset.last_updated || 'β€”'}</td>
<td><button class="ghost" data-dataset="${dataset.name}">Preview</button></td>
</tr>
`,
)
.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 = `<p>Loading ${name} sample...</p>`;
const result = await apiClient.getDatasetSample(name);
if (!result.ok) {
this.previewContent.innerHTML = `<div class="inline-message inline-error">${result.error}</div>`;
return;
}
const rows = result.data || [];
if (!rows.length) {
this.previewContent.innerHTML = '<p>No sample rows available.</p>';
return;
}
const headers = Object.keys(rows[0]);
this.previewContent.innerHTML = `
<table>
<thead><tr>${headers.map((h) => `<th>${h}</th>`).join('')}</tr></thead>
<tbody>
${rows
.map((row) => `<tr>${headers.map((h) => `<td>${row[h]}</td>`).join('')}</tr>`)
.join('')}
</tbody>
</table>
`;
}
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 = `<tr><td colspan="4">${result.error}</td></tr>`;
return;
}
this.models = result.data || [];
this.modelsBody.innerHTML = this.models
.map(
(model) => `
<tr>
<td>${model.name}</td>
<td>${model.task || 'β€”'}</td>
<td>${model.status || 'β€”'}</td>
<td>${model.description || ''}</td>
</tr>
`,
)
.join('');
const modelSelect = this.section.querySelector('[data-model-select]');
if (modelSelect) {
modelSelect.innerHTML = this.models.map((m) => `<option value="${m.name}">${m.name}</option>`).join('');
}
}
}
export default DatasetsModelsView;