Cell Validation with Renderers
One straightforward way to validate cell data is by using cell properties cellProperties & cellTemplate.
You can apply validation rules directly to individual cells, marking them as invalid based on certain conditions.
For example, you can highlight incorrect cells by checking their values and applying an invalid tag:
This style will highlight any invalid cell with a red background, providing immediate visual feedback to the user.
Source code
TypeScript ts
import { defineCustomElements } from '@revolist/revogrid/loader';
import type { ColumnRegular } from '@revolist/revogrid';
import { ColumnStretchPlugin, TooltipPlugin, validationRenderer } from '@revolist/revogrid-pro';
import { currentTheme } from '../composables/useRandomData';
import { basicValidationSource, invalidCellStyle } from './validate-basic.data';
defineCustomElements();
const columns: ColumnRegular[] = [
{
name: '💰 Price',
prop: 'price',
...validationRenderer({
invalidProperties: () => ({
style: invalidCellStyle,
}),
}),
validationTooltip: (value: any) =>
value >= 10 && value <= 20
? undefined
: `Price ${value} must stay between 10 and 20`,
validate: (value: number) => value >= 10 && value <= 20,
},
];
export function load(parentSelector: string) {
const grid = document.createElement('revo-grid');
const { isDark } = currentTheme();
grid.source = basicValidationSource;
grid.columns = columns;
grid.plugins = [ColumnStretchPlugin, TooltipPlugin];
Object.assign(grid, {
stretch: 'all',
})
grid.theme = isDark() ? 'darkCompact' : 'compact';
grid.hideAttribution = true;
grid.range = true;
document.querySelector(parentSelector)?.appendChild(grid);
}
Vue vue
<template>
<RevoGrid
class="cell-border rounded-lg overflow-hidden"
style="min-height: 320px;"
:columns="columns"
:source="source"
:plugins="plugins"
stretch="all"
:theme="isDark ? 'darkCompact' : 'compact'"
hide-attribution
range
/>
</template>
<script setup lang="ts">
import RevoGrid, { type ColumnRegular } from '@revolist/vue3-datagrid';
import { ColumnStretchPlugin, TooltipPlugin, validationRenderer } from '@revolist/revogrid-pro';
import { currentThemeVue } from '../composables/useRandomData';
import { basicValidationSource, invalidCellStyle } from './validate-basic.data';
const { isDark } = currentThemeVue();
const columns: ColumnRegular[] = [
{
name: '💰 Price',
prop: 'price',
...validationRenderer({
invalidProperties: () => ({
style: invalidCellStyle,
}),
}),
validationTooltip: (value: any) =>
value >= 10 && value <= 20
? undefined
: `Price ${value} must stay between 10 and 20`,
validate: (value: number) => value >= 10 && value <= 20,
},
];
const source = basicValidationSource;
const plugins = [ColumnStretchPlugin, TooltipPlugin];
</script>
React tsx
import React from 'react';
import { RevoGrid, type ColumnRegular } from '@revolist/react-datagrid';
import { ColumnStretchPlugin, TooltipPlugin, validationRenderer } from '@revolist/revogrid-pro';
import { currentTheme } from '../composables/useRandomData';
import { basicValidationSource, invalidCellStyle } from './validate-basic.data';
const { isDark } = currentTheme();
export default function ValidateBasic() {
const columns: ColumnRegular[] = [
{
name: '💰 Price',
prop: 'price',
...validationRenderer({
invalidProperties: () => ({
style: invalidCellStyle,
}),
}),
validationTooltip: (value: any) =>
value >= 10 && value <= 20
? undefined
: `Price ${value} must stay between 10 and 20`,
validate: (value: number) => value >= 10 && value <= 20,
},
];
return (
<RevoGrid
style={{ height: '320px' }}
theme={isDark() ? 'darkCompact' : 'compact'}
columns={columns}
source={basicValidationSource}
plugins={[ColumnStretchPlugin, TooltipPlugin]}
stretch="all"
hideAttribution
range
/>
);
}
Angular ts
import { Component } from '@angular/core';
import { RevoGrid } from '@revolist/angular-datagrid';
import { ColumnStretchPlugin, TooltipPlugin, validationRenderer } from '@revolist/revogrid-pro';
import { currentTheme } from '../composables/useRandomData';
import { basicValidationSource, invalidCellStyle } from './validate-basic.data';
@Component({
selector: 'validate-basic-grid',
standalone: true,
imports: [RevoGrid],
template: `
<revo-grid
class="grow h-full cell-border"
[source]="source"
[columns]="columns"
[plugins]="plugins"
stretch="all"
[theme]="theme"
[hideAttribution]="true"
[range]="true"
style="min-height: 320px;"
></revo-grid>
`
})
export class ValidateBasicGridComponent {
source = basicValidationSource;
columns = [
{
name: '💰 Price',
prop: 'price',
...validationRenderer({
invalidProperties: () => ({
style: invalidCellStyle,
}),
}),
validationTooltip: (value: any) =>
value >= 10 && value <= 20
? undefined
: `Price ${value} must stay between 10 and 20`,
validate: (value: number) => value >= 10 && value <= 20,
},
];
plugins = [ColumnStretchPlugin, TooltipPlugin];
theme = currentTheme().isDark() ? 'darkCompact' : 'compact';
}