Skip to content

Data Methods API

These methods allow you to retrieve and manipulate the underlying dataset in your Tuva Data Tool.

getRawData

Retrieve the complete dataset as a 2D array.

typescript
getRawData(): any[][]

Returns

TypeDescription
any[][]Two-dimensional array where each inner array represents a row

Example

javascript
const data = tuvaDataTools.actions.getRawData();
console.log(data);
// [
//   [1, 'Alice', '12', '85'],
//   [2, 'Bob', '13', '90'],
//   [3, 'Charlie', '12', '88']
// ]

Try It Out

JavaScript Editor
Result / Preview

getColumnIds

Get the unique identifiers for each column.

typescript
getColumnIds(): string[]

Returns

TypeDescription
string[]Array of column ID strings

Example

javascript
const columnIds = tuvaDataTools.actions.getColumnIds();
console.log(columnIds);
// ['id', 'name', 'age', 'score']

getColumnNames

Get the human-readable display names for each column.

typescript
getColumnNames(): string[]

Returns

TypeDescription
string[]Array of column name strings

Example

javascript
const columnNames = tuvaDataTools.actions.getColumnNames();
console.log(columnNames);
// ['Case', 'Name', 'Age', 'Score']

Try It Out

JavaScript Editor
Result / Preview

appendRawData

Add new rows to the existing dataset.

typescript
appendRawData(rows: any[][]): void

Parameters

NameTypeDescription
rowsany[][]Array of rows to append, each row matching the column structure

Example

javascript
// Add a single row
tuvaDataTools.actions.appendRawData([
  [4, 'David', '14', '95']
]);

// Add multiple rows
tuvaDataTools.actions.appendRawData([
  [5, 'Eve', '13', '87'],
  [6, 'Frank', '12', '91'],
  [7, 'Grace', '14', '89']
]);

WARNING

Ensure the new rows match the existing column structure. Mismatched columns may cause rendering issues.

Try It Out

JavaScript Editor
Result / Preview

getMetaData

Retrieve the metadata describing the dataset structure and field properties.

typescript
getMetaData(): MetaData

Returns

TypeDescription
MetaDataObject containing field definitions and properties

MetaData Structure

typescript
interface MetaData {
  fields: Field[];
}

interface Field {
  id: string;        // Unique identifier
  name: string;      // Display name
  type?: string;     // Data type (numeric, categorical, etc.)
  unit?: string;     // Unit of measurement
  precision?: number; // Decimal precision for numeric fields
}

Example

javascript
const metaData = tuvaDataTools.actions.getMetaData();
console.log(metaData);
// {
//   fields: [
//     { id: 'id', name: 'Case' },
//     { id: 'name', name: 'Name' },
//     { id: 'age', name: 'Age', type: 'numeric' },
//     { id: 'score', name: 'Score', type: 'numeric' }
//   ]
// }

getDirtyRawData

Get the modified data that hasn't been persisted. Useful for tracking user edits.

typescript
getDirtyRawData(): any[][]

Returns

TypeDescription
any[][]Array of modified rows

Example

javascript
const unsavedChanges = tuvaDataTools.actions.getDirtyRawData();
if (unsavedChanges.length > 0) {
  console.log('There are unsaved changes:', unsavedChanges);
  // Prompt user to save or handle accordingly
}

Working with Data: Complete Examples

Exporting Data to CSV

javascript
function exportToCSV() {
  if (!tuvaDataTools || !tuvaDataTools.actions) return;
  
  const columnNames = tuvaDataTools.actions.getColumnNames();
  const data = tuvaDataTools.actions.getRawData();
  
  // Create CSV content
  let csv = columnNames.join(',') + '\n';
  data.forEach(row => {
    csv += row.map(cell => `"${cell}"`).join(',') + '\n';
  });
  
  // Download
  const blob = new Blob([csv], { type: 'text/csv' });
  const url = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = 'data-export.csv';
  a.click();
}

Real-time Data Updates

javascript
// Render component
const tuvaDataTools = ReactDOM.render(
  React.createElement(TuvaDataTools, {
    columnIds: columnIds,
    columnNames: columnNames,
    rowData: rowData,
    metaData: metaData
  }),
  document.getElementById('root')
);

// Poll for new data every 5 seconds
const interval = setInterval(async () => {
  const response = await fetch('/api/new-records');
  const newRows = await response.json();
  
  if (newRows.length > 0 && tuvaDataTools && tuvaDataTools.actions) {
    tuvaDataTools.actions.appendRawData(newRows);
  }
}, 5000);

// Clean up
// clearInterval(interval);

Data Validation Before Append

javascript
function validateAndAppend(newRows) {
  if (!tuvaDataTools || !tuvaDataTools.actions) return;
  
  const columnIds = tuvaDataTools.actions.getColumnIds();
  const expectedColumns = columnIds.length;
  
  const validRows = newRows.filter(row => {
    if (row.length !== expectedColumns) {
      console.warn('Row has incorrect number of columns:', row);
      return false;
    }
    return true;
  });
  
  if (validRows.length > 0) {
    tuvaDataTools.actions.appendRawData(validRows);
    console.log(`Added ${validRows.length} rows`);
  }
}

Comparing Original and Modified Data

javascript
function hasUnsavedChanges() {
  if (!tuvaDataTools || !tuvaDataTools.actions) return false;
  
  const original = tuvaDataTools.actions.getRawData();
  const dirty = tuvaDataTools.actions.getDirtyRawData();
  
  return dirty.length > 0;
}

function promptSaveBeforeLeave() {
  window.addEventListener('beforeunload', (e) => {
    if (hasUnsavedChanges()) {
      e.preventDefault();
      e.returnValue = 'You have unsaved changes. Are you sure you want to leave?';
    }
  });
}

Tuva Data Tools Documentation