npm.io
9.2.30 • Published yesterday

@operato/data-grist

Licence
MIT
Version
9.2.30
Deps
13
Size
2.5 MB
Vulns
0
Weekly
0

Data-Grist

Data-Grist is a powerful web component for displaying and manipulating data. It can present data in Grid, List, or Card formats and provides various features such as data sorting, filtering, editing, and more.

Key Features

  • Multiple Display Modes: Flexibly display the same data in grid, list, or card formats
  • Data Manipulation: Add, modify, and delete records
  • Sorting and Filtering: Single/multi-column sorting, various filtering options
  • Editing Capabilities: Inline cell editing, validation
  • Pagination: Standard paging and infinite scroll support
  • Selection: Single/multiple record selection
  • State Tracking: Track changed (dirty) records
  • Customization: Support for various renderers, editors, and event handlers
  • Mobile Responsive: Responsive design support

Installation

npm install @operato/data-grist

Basic Usage

<script type="module">
  import '@operato/data-grist/ox-grist.js'
</script>

<ox-grist
  .mode=${'GRID'}
  .config=${gridConfig}
  .fetchHandler=${fetchDataFunction}
></ox-grist>

Modes

Data-Grist supports three display modes:

  • GRID: Tabular data display (default)
  • LIST: Mobile-friendly list format display
  • CARD: Card format display
// Set mode
gristElement.mode = 'GRID' // or 'LIST', 'CARD'

Configuration (Config)

Data-Grist provides various configuration options.

const config = {
  columns: [
    {
      type: 'string',
      name: 'name',
      header: 'Name',
      record: {
        editable: true
      },
      sortable: true,
      width: 150
    }
    // More columns...
  ],
  rows: {
    appendable: true, // Allow adding new records
    editable: true, // Allow editing records
    selectable: {
      // Record selection settings
      multiple: true // Allow multiple selections
    }
  },
  pagination: {
    infinite: false, // Use paging instead of infinite scroll
    page: 1, // Starting page
    limit: 20 // Records per page
  }
  // Additional settings...
}
Column Types
// String column
{
  type: 'string',
  name: 'firstName',
  header: 'First Name'
}

// Number column
{
  type: 'number',
  name: 'age',
  header: 'Age',
  record: {
    align: 'right'
  }
}

// Boolean column
{
  type: 'boolean',
  name: 'isActive',
  header: 'Active'
}

// Link column
{
  type: 'link',
  name: 'website',
  header: 'Website',
  record: {
    options: {
      href: (column, record) => record.url,
      target: '_blank'
    }
  }
}

// Gutter column (row number, checkbox, button, etc.)
{
  type: 'gutter',
  gutterName: 'sequence' // 'row-selector', 'button', 'dirty', etc.
}

Fetching Data

Data can be retrieved through the fetchHandler function.

const fetchHandler = async params => {
  const { page, limit, sorters, filters } = params

  // Fetch data from server
  const response = await fetch(`/api/data?page=${page}&limit=${limit}`)
  const data = await response.json()

  return {
    total: data.total,
    records: data.items
  }
}

// Configure the grist
gristElement.fetchHandler = fetchHandler

Record Manipulation API

Adding Records
// Add record at the end (default)
gristElement.addRecord({
  name: 'John Doe',
  age: 30
})

// Add record at the top
gristElement.addRecordToTop({
  name: 'Jane Smith',
  age: 25
})
Record Selection
// Get all selected records
const selectedRecords = gristElement.selected

// Set selection
gristElement.selected = [record1, record2]

// Select records using a selector function
gristElement.select(record => record.age > 30)
Tracking Changed Records
// Get modified records
const dirtyRecords = gristElement.dirtyRecords

// Check for changes
gristElement.checkDirties()

// Export changes as patches
const patches = gristElement.exportPatchList()

Events

Data-Grist triggers various events.

// Record selection change event
gristElement.addEventListener('select-record-change', e => {
  const { records, added, removed } = e.detail
  console.log('Selected records:', records)
})

// Field change event
gristElement.addEventListener('field-change', e => {
  const { after, before, column, record, row } = e.detail
  console.log('Changed field:', column.name, 'from', before, 'to', after)
})

// Record change event
gristElement.addEventListener('record-change', e => {
  const { before, after, column, row } = e.detail
  console.log('Record changed:', row)
})

Advanced Features

Column Accumulation Feature (Accumulator)
{
  type: 'number',
  name: 'amount',
  header: 'Amount',
  accumulator: 'sum' // 'avg', 'count', 'min', 'max' or custom function
}
Tree Structure Data
const config = {
  // ...
  tree: {
    childrenProperty: 'children', // Property name where child nodes are stored
    expanded: true // Initial tree expansion state
  }
}
Grouped Headers
const config = {
  columns: [
    // ...
    {
      type: 'string',
      name: 'firstName',
      header: 'First Name',
      group: 'personalInfo'
    },
    {
      type: 'string',
      name: 'lastName',
      header: 'Last Name',
      group: 'personalInfo'
    }
  ],
  // ...
  rows: {
    // ...
    groups: [
      {
        name: 'personalInfo',
        title: 'Personal Information'
      }
    ]
  }
}
User Settings Storage
// Configure user settings provider
gristElement.personalConfigProvider = {
  async load() {
    // Load saved settings
    return JSON.parse(localStorage.getItem('userGristConfig'))
  },
  async save(preference) {
    // Save user settings
    localStorage.setItem('userGristConfig', JSON.stringify(preference))
  }
}

Styling

Data-Grist can be styled through CSS variables.

ox-grist {
  --grid-header-background-color: #f5f5f5;
  --grid-record-background-color: white;
  --grid-record-odd-background-color: #f9f9f9;
  --grid-header-color: #333;
  --grid-record-hover-background-color: #e9e9e9;
}

API Reference

Properties
Property Type Description
mode string Display mode ('GRID', 'LIST', 'CARD')
config object Grist configuration object
data object Data to display
selectedRecords array Array of selected records
explicitFetch boolean Enable explicit data fetching
fetchHandler function Data fetching function
fetchOptions object Data fetching options
filters array Array of filters
sorters array Array of sorters
pagination object Pagination settings
Methods
Method Description
fetch(reset) Fetch data
addRecord(record) Add a record
addRecordToTop(record) Add a record at the top
deleteSelectedRecords(dirty) Delete selected records
cloneSelectedRecords() Clone selected records
checkDirties() Check for modified records
undo() Undo last action
redo() Redo undone action
reset() Reset data
commit() Commit changes
select(selector, reset) Select records using a function
exportPatchList(options) Export list of change patches
exportRecords(options) Export record data

Examples

Basic Grid
<ox-grist
  .mode=${'GRID'}
  .config=${gridConfig}
  .fetchHandler=${fetchData}
  @record-change=${handleRecordChange}
></ox-grist>
Editable Grid
<ox-grist
  .mode=${'GRID'}
  .config=${{
    columns: [/* column definitions */],
    rows: {
      appendable: true,
      editable: true,
      selectable: { multiple: true }
    }
  }}
  .data=${{ records: initialData }}
></ox-grist>
Add Row to Top Button
<button @click="${() => gristRef.addRecordToTop()}">Add Row to Top</button>
<ox-grist id="my-grist"></ox-grist>

<script>
  const gristRef = document.getElementById('my-grist')
</script>

License

MIT