Skip to content

PantanalGrid

Directive

pantanal-grid

Component

vue
<PantanalGrid
  :rows="rows"
  :columns="columns"
  key-field="id"
  ...
/>

Props

Data Props

PropTypeDefaultDescription
rowsRow[][]Array of data rows to display
columnsColumnDef[][]Column definitions
keyFieldstring | keyof Row'id'Field name used as unique identifier for rows
dataProviderDataProvider<T>-Function that returns { rows, total } for server-side data

State Props (v-model)

PropTypeDefaultDescription
sortSortDescriptor[][]Current sort state (v-model)
filterFilterDescriptor[][]Current filter state (v-model)
pagenumber1Current page number (v-model)
pageSizenumber20Number of items per page (v-model)
selectedKeysany[][]Selected row keys (v-model)
groupGroupDescriptor[][]Current group state (v-model)

Display Props

PropTypeDefaultDescription
heightnumber420Fixed height of the grid (required for virtual scrolling)
rowHeightnumber44Height of each row in pixels
autoHeightbooleanfalseAutomatically adjust height to content
maxBodyHeightnumber-Maximum height of the body
stripedbooleanfalseApply striped row styling
rtlbooleanfalseRight-to-left layout
density'default' | 'compact''default'Row density

Feature Props

PropTypeDefaultDescription
selectable'single' | 'multiple' | falsefalseRow selection mode
sortablebooleantrueEnable column sorting globally
sortableMode'single' | 'multiple''single'Sorting mode
sortableAllowUnsortbooleantrueAllow unsorting columns
sortableShowIndexesbooleanfalseShow sort order indexes in multiple mode
filterablebooleantrueEnable column filtering globally
filterableMode'row' | 'menu' | 'menu, row' | false'row'Filter UI mode
filterableExtrabooleanfalseAllow second filter criterion
showFilterRowboolean-Show filter row (auto-determined by filterableMode)
pageablebooleantrueEnable pagination
virtualbooleanfalseEnable virtual scrolling
editableboolean | 'inline' | 'popup' | 'batch'falseEnable inline editing
editableMode'incell' | 'inline' | 'popup''incell'Editing mode
enableColumnResizebooleantrueEnable column resizing
enableColumnReorderbooleantrueEnable column reordering
navigatablebooleanfalseEnable keyboard navigation
allowCopybooleanfalseAllow copying cell values
allowCopyDelimiterstring'\t'Delimiter for copied values

Server-Side Props

PropTypeDefaultDescription
serverSidebooleanfalseEnable server-side mode
totalnumber-Total number of items (for server-side)
loadingbooleanfalseLoading state indicator
autoBindbooleantrueAutomatically bind data when using dataProvider

Grouping Props

PropTypeDefaultDescription
groupGroupDescriptor[][]Group configuration
aggregatesRecord<string, AggregateName[]>{}Aggregate functions
showGroupFootersbooleanfalseShow group footers

Internationalization Props

PropTypeDefaultDescription
locale'en' | 'es' | 'pt' | string'en'Locale code
messagesPartial<Messages>{}Custom messages

Persistence Props

PropTypeDefaultDescription
persistStateKeystring-Key for persisting grid state
persistSelectionbooleanfalsePersist selection across pages

Responsive Props

PropTypeDefaultDescription
responsive'auto' | 'table' | 'cards''auto'Responsive mode
cardBreakpointnumber768Breakpoint for card mode (in pixels)
showFiltersInCardsbooleanfalseShow filters in card mode

Pagination Props

PropTypeDefaultDescription
paginationVariant'simple' | 'pages' | 'edges''simple'Pagination style
paginationShowTextbooleantrueShow pagination text
paginationShowIconsbooleantrueShow pagination icons
paginationShowTotalbooleantrueShow total count
paginationMaxPagesnumber5Maximum pages to show
pageableAlwaysVisiblebooleantrueAlways show pager
pageablePageSizesnumber[] | boolean | (number | 'all')[][10, 20, 50, 100]Available page sizes
pageablePreviousNextbooleantrueShow previous/next buttons
pageableNumericbooleanfalseShow numeric page buttons
pageableButtonCountnumber-Maximum number of numeric buttons
pageableInputbooleanfalseShow page number input
pageableRefreshbooleanfalseShow refresh button
pageableResponsivebooleantrueEnable responsive pager
pageableInfobooleantrueShow pagination info

Template Props

PropTypeDefaultDescription
rowTemplatestring | ((row: T, rowIndex: number) => string)-Custom row template
altRowTemplatestring | ((row: T, rowIndex: number) => string)-Custom alternate row template
detailTemplatestring | ((row: T, rowIndex: number) => string)-Master-detail template
noRecordsboolean | string | (() => string) | object | false-No records message/template

Toolbar Props

PropTypeDefaultDescription
toolbar('create' | 'save' | 'cancel' | 'excel' | 'pdf')[] | string | (() => string)-Toolbar configuration

Column Menu Props

PropTypeDefaultDescription
columnMenubooleanfalseEnable column menu
columnMenuColumnsbooleantrueShow columns option in menu
columnMenuFilterablebooleantrueShow filter option in menu
columnMenuSortablebooleantrueShow sort option in menu

Editing Props

PropTypeDefaultDescription
editableConfirmationboolean | string | ((row: T) => string)falseDelete confirmation
editableCancelDeletestring-Cancel delete button text
editableConfirmDeletestring-Confirm delete button text
editableCreateAt'top' | 'bottom''top'Where to create new rows
editableDestroybooleantrueAllow row deletion
editableUpdatebooleantrueAllow row updates
editableTemplatestring | ((row: T) => string)-Custom edit template
editableWindowRecord<string, any>-Popup window configuration

Excel Export Props

PropTypeDefaultDescription
excelAllPagesbooleanfalseExport all pages
excelFileNamestring'export.xlsx'Excel file name
excelFilterablebooleantrueInclude filters in export
excelForceProxybooleanfalseForce proxy for download
excelProxyUrlstring-Proxy URL for Excel export

PDF Export Props

PropTypeDefaultDescription
pdfAllPagesbooleanfalseExport all pages
pdfAvoidLinksboolean | stringtrueConvert links to text or ignore via CSS selector
pdfPaperSizestring | [number, number] | [string, string]'A4'Paper size
pdfMarginobject{ top: '1cm', left: '1cm', right: '1cm', bottom: '1cm' }Margins object
pdfMarginTopstring | number-Top margin
pdfMarginLeftstring | number-Left margin
pdfMarginRightstring | number-Right margin
pdfMarginBottomstring | number-Bottom margin
pdfLandscapebooleanfalseLandscape orientation
pdfRepeatHeadersbooleantrueRepeat headers on each page
pdfScalenumber1Scale factor
pdfFileNamestring'export.pdf'PDF file name
pdfAuthorstring-PDF author metadata
pdfTitlestring-PDF title metadata
pdfSubjectstring-PDF subject metadata
pdfKeywordsstring-PDF keywords metadata
pdfCreatorstring-PDF creator metadata
pdfDateDatenew Date()PDF creation date
pdfTemplatestring-HTML template for headers/footers
pdfForceProxybooleanfalseForce proxy for download
pdfProxyUrlstring-Proxy URL for PDF export
pdfProxyTargetstring-Where to display document ('_blank', '_self', iframe name)

Other Props

PropTypeDefaultDescription
showFooterbooleantrueShow footer
pinnedShadowsbooleanfalseShow shadows on pinned columns
columnResizeHandleWidthnumber4Column resize handle width
scrollableboolean | object-Scrollable configuration

Events

State Events (v-model)

EventPayloadDescription
update:sortSortDescriptor[]Emitted when sort changes
update:filterFilterDescriptor[]Emitted when filter changes
update:pagenumberEmitted when page changes
update:pageSizenumberEmitted when page size changes
update:selectedKeysany[]Emitted when selection changes
update:groupGroupDescriptor[]Emitted when group changes

Data Events

EventPayloadDescription
selectionChangeany[]Emitted when selection changes
rowClickRowEmitted when row is clicked
loadingbooleanEmitted when loading state changes
errorunknownEmitted when an error occurs
databinding{ sort?, filter?, group?, page?, pageSize? }Emitted before data binding
databoundany[]Emitted after data binding

Column Events

EventPayloadDescription
columnResize{ field: string, width: number }Emitted when column is resized
columnReorder{ from: number, to: number }Emitted when column is reordered
columnhide{ column: ColumnDef, field: string }Emitted when column is hidden
columnshow{ column: ColumnDef, field: string }Emitted when column is shown
columnlock{ column: ColumnDef, field: string }Emitted when column is locked
columnunlock{ column: ColumnDef, field: string }Emitted when column is unlocked
columnmenuinit{ column: ColumnDef, field: string, container: HTMLElement }Emitted when column menu is initialized
columnmenuopen{ column: ColumnDef, field: string }Emitted when column menu opens

Editing Events

EventPayloadDescription
edit{ row: any, field?: string }Emitted when editing starts
editCommit{ row: any, field: string, value: any }Emitted when cell edit is committed
editCancel{ row: any }Emitted when editing is cancelled
editSave{ row: any }Emitted when row is saved
create{ row: any }Emitted when new row is created
destroy{ row: any }Emitted when row is deleted
save{ changes: Array<{ type: 'create' | 'update' | 'destroy', row: any }> }Emitted when all changes are saved
cancelvoidEmitted when all changes are cancelled
validationError{ row: any, field: string, error: string }Emitted when validation fails

Grouping Events

EventPayloadDescription
toggleGroupkey: string, open: booleanEmitted when group is toggled
group{ groups: GroupDescriptor[] }Emitted when group changes
groupexpand{ group: { field: string, value: any, aggregates? } }Emitted when group expands
groupcollapse{ group: { field: string, value: any, aggregates? } }Emitted when group collapses

Sorting/Filtering Events

EventPayloadDescription
sort{ sort: SortDescriptor[] }Emitted when sort changes
filter{ filter: FilterDescriptor[] }Emitted when filter changes

Export Events

EventPayloadDescription
pdfExport{ fileName: string }Emitted when PDF export completes

Other Events

EventPayloadDescription
refreshvoidEmitted when refresh button is clicked

Methods

Access methods via component ref:

vue
<script setup lang="ts">
import { ref } from 'vue'
import { PantanalGrid } from '@pantanal/grid'

const gridRef = ref<InstanceType<typeof PantanalGrid>>()

// Call methods
gridRef.value?.exportToPdf()
gridRef.value?.getOptions()
</script>

getOptions

returns

Returns the current grid state including sort, filter, page, pageSize, column order, widths, and selectedKeys (if persistSelection is enabled).

Returns: GridOptions

Example:

typescript
const options = gridRef.value?.getOptions()
// { sort: [{ field: 'name', dir: 'asc' }], page: 1, pageSize: 20, order: [0, 1, 2], widths: [100, 200, 150] }

setOptions

parameters
  • options: GridOptions - The grid state to set
returns

Sets the grid state programmatically. Updates sort, filter, page, pageSize, column order, widths, and selectedKeys.

Example:

typescript
gridRef.value?.setOptions({
  sort: [{ field: 'price', dir: 'desc' }],
  page: 2,
  pageSize: 50,
  order: [1, 0, 2],
  widths: [150, 200, 100]
})

exportToPdf

returns

Exports the grid data to PDF format. The PDF will be downloaded with the filename specified in pdfFileName prop (default: 'export.pdf').

Returns: Promise<void>

Example:

typescript
await gridRef.value?.exportToPdf()

saveAsPdf

returns

Alias for exportToPdf. Exports the grid data to PDF format.

Returns: Promise<void>

exportToExcel

returns

Exports the grid data to Excel format (.xlsx). The file will be downloaded with the filename specified in excelFileName prop (default: 'export.xlsx').

Returns: Promise<void>

Example:

typescript
await gridRef.value?.exportToExcel()

exportToCSV

returns

Exports the grid data to CSV format. The file will be downloaded with a .csv extension.

Returns: Promise<void>

Example:

typescript
await gridRef.value?.exportToCSV()

exportToDocx

returns

Exports the grid data to Word document format (.docx). The file will be downloaded with a .docx extension.

Returns: Promise<void>

Example:

typescript
await gridRef.value?.exportToDocx()

isRowEditing

parameters
  • row: any - The row to check
returns

Returns true if the specified row is currently in edit mode, false otherwise.

Returns: boolean

Example:

typescript
const isEditing = gridRef.value?.isRowEditing(row)

GridOptions Interface

typescript
interface GridOptions {
  sort?: SortDescriptor[]
  filter?: FilterDescriptor[]
  page?: number
  pageSize?: number
  order?: number[]  // Column order
  widths?: (number | undefined)[]  // Column widths
  selectedKeys?: any[]  // Only if persistSelection is enabled
}

Note: group is not included in getOptions/setOptions as it's controlled via props. Use v-model:group to manage grouping.

Slots

Default Slot

Use PantanalColumn components as children:

vue
<PantanalGrid :rows="rows" key-field="id">
  <PantanalColumn field="id" title="ID" />
  <PantanalColumn field="name" title="Name" />
</PantanalGrid>

Named Slots

SlotPropsDescription
toolbar-Custom toolbar content
header{ column: ColumnDef }Custom header cell
cell{ row: Row, column: ColumnDef, value: any, rowIndex: number, columnIndex: number }Custom cell content
footer{ aggregates: Record<string, any> }Custom footer content

Slot Examples

Custom Toolbar

vue
<template>
  <PantanalGrid :rows="rows" :columns="columns" key-field="id">
    <template #toolbar>
      <button @click="customAction">Custom Action</button>
    </template>
  </PantanalGrid>
</template>

Custom Cell

vue
<template>
  <PantanalGrid :rows="rows" :columns="columns" key-field="id">
    <template #cell="{ column, row, value }">
      <div v-if="column.field === 'status'">
        <span :class="value === 'active' ? 'text-green-500' : 'text-red-500'">
          {{ value }}
        </span>
      </div>
      <div v-else>{{ value }}</div>
    </template>
  </PantanalGrid>
</template>

Types

SortDescriptor

typescript
interface SortDescriptor {
  field: string
  dir: 'asc' | 'desc'
}

FilterDescriptor

typescript
interface FilterDescriptor {
  field: string
  operator: 'contains' | 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 
           'startswith' | 'endswith' | 'isnull' | 'isnotnull' | 
           'isempty' | 'isnotempty'
  value: unknown
  logic?: 'and' | 'or'
  filters?: FilterDescriptor[]
}

GroupDescriptor

typescript
interface GroupDescriptor {
  field: string
  dir?: 'asc' | 'desc'
}

AggregateName

typescript
type AggregateName = 'sum' | 'avg' | 'min' | 'max' | 'count'

SelectionMode

typescript
type SelectionMode = 'single' | 'multiple' | false

ResponsiveMode

typescript
type ResponsiveMode = 'auto' | 'table' | 'cards'

PaginationVariant

typescript
type PaginationVariant = 'simple' | 'pages' | 'edges'

DataProvider

typescript
interface DataProviderArgs {
  page: number
  pageSize: number
  sort: SortDescriptor[]
  filter: FilterDescriptor[]
  signal?: AbortSignal
}

interface DataProviderResult<T = Row> {
  rows: T[]
  total?: number
}

type DataProvider<T = Row> = (args: DataProviderArgs) => Promise<DataProviderResult<T>>

Examples

Basic Usage

vue
<template>
  <PantanalGrid
    :rows="rows"
    :columns="columns"
    key-field="id"
  />
</template>

With State Management

vue
<template>
  <PantanalGrid
    :rows="rows"
    :columns="columns"
    key-field="id"
    v-model:sort="sort"
    v-model:filter="filter"
    v-model:page="page"
    v-model:pageSize="pageSize"
  />
</template>

Server-Side Mode

vue
<template>
  <PantanalGrid
    :rows="rows"
    :columns="columns"
    key-field="id"
    :server-side="true"
    :total="total"
    :loading="loading"
    v-model:page="page"
    v-model:pageSize="pageSize"
  />
</template>

With Data Provider

vue
<script setup lang="ts">
async function dataProvider(args) {
  const response = await fetch(`/api/data?page=${args.page}&pageSize=${args.pageSize}`)
  const data = await response.json()
  return {
    rows: data.items,
    total: data.total
  }
}
</script>

<template>
  <PantanalGrid
    :columns="columns"
    key-field="id"
    :data-provider="dataProvider"
  />
</template>

With Methods

vue
<script setup lang="ts">
import { ref } from 'vue'
import { PantanalGrid } from '@pantanal/grid'

const gridRef = ref<InstanceType<typeof PantanalGrid>>()

function handleExport() {
  gridRef.value?.exportToExcel()
}
</script>

<template>
  <div>
    <button @click="handleExport">Export</button>
    <PantanalGrid
      ref="gridRef"
      :rows="rows"
      :columns="columns"
      key-field="id"
    />
  </div>
</template>

See Also