Feel free to share demo-related thoughts here.
If you have technical questions, please create a support ticket in the DevExpress Support Center.
Thank you for the feedback!
If you have technical questions, please create a support ticket in the DevExpress Support Center.
Backend API
<template>
<div>
<DxDataGrid
id="gridContainer"
:data-source="orders"
key-expr="ID"
:columns-auto-width="true"
:show-borders="true"
:filter-builder="filterBuilder"
:filter-value="filterValue"
>
<DxFilterRow :visible="true"/>
<DxFilterPanel :visible="true"/>
<DxFilterBuilderPopup :position="filterBuilderPopupPosition"/>
<DxHeaderFilter :visible="true"/>
<DxScrolling mode="infinite"/>
<DxColumn
:header-filter="{ groupInterval: 10000 }"
data-type="number"
data-field="OrderNumber"
caption="Invoice Number"
/>
<DxColumn
data-field="OrderDate"
data-type="date"
/>
<DxColumn
:editor-options="saleAmountEditorOptions"
:header-filter="{ dataSource: saleAmountHeaderFilters }"
data-field="SaleAmount"
data-type="number"
format="currency"
/>
<DxColumn
data-field="Employee"
data-type="string"
/>
<DxColumn
data-field="CustomerInfo.StoreCity"
caption="City"
data-type="string"
/>
<DxColumn
data-field="CustomerInfo.StoreState"
caption="State"
data-type="string"
/>
</DxDataGrid>
</div>
</template>
<script setup lang="ts">
import {
DxDataGrid,
DxColumn,
DxHeaderFilter,
DxFilterRow,
DxFilterPanel,
DxFilterBuilderPopup,
DxScrolling,
} from 'devextreme-vue/data-grid';
import { PositionConfig } from 'devextreme/animation/position';
import { orders, Order } from './data.ts';
const saleAmountEditorOptions = {
format: 'currency',
showClearButton: true,
inputAttr: {
'aria-label': 'Filter cell',
},
};
const filterBuilderPopupPosition: PositionConfig = {
of: window,
at: 'top',
my: 'top',
offset: { y: 10 },
};
const filterBuilder: DxDataGrid['filterBuilder'] = {
customOperations: [{
name: 'weekends',
caption: 'Weekends',
dataTypes: ['date'],
icon: 'check',
hasValue: false,
calculateFilterExpression: () => [[getOrderDay, '=', 0], 'or', [getOrderDay, '=', 6]],
}],
allowHierarchicalFields: true,
};
const filterValue = [['Employee', '=', 'Clark Morgan'], 'and', ['OrderDate', 'weekends']];
const saleAmountHeaderFilters = [
{
text: 'Less than $3000',
value: ['SaleAmount', '<', 3000],
}, {
text: '$3000 - $5000',
value: [['SaleAmount', '>=', 3000], ['SaleAmount', '<', 5000]],
}, {
text: '$5000 - $10000',
value: [['SaleAmount', '>=', 5000], ['SaleAmount', '<', 10000]],
}, {
text: '$10000 - $20000',
value: [['SaleAmount', '>=', 10000], ['SaleAmount', '<', 20000]],
}, {
text: 'Greater than $20000',
value: ['SaleAmount', '>=', 20000],
},
];
const getOrderDay = (rowData: Order) => (new Date(rowData.OrderDate)).getDay();
</script>
<style scoped>
.demo-container {
height: 570px;
}
#gridContainer {
height: 440px;
}
.dx-filterbuilder-overlay .dx-scrollable-container {
max-height: 400px;
}
</style>
window.exports = window.exports || {};
window.config = {
transpiler: 'plugin-babel',
meta: {
'*.vue': {
loader: 'vue-loader',
},
'*.ts': {
loader: 'demo-ts-loader',
},
'*.svg': {
loader: 'svg-loader',
},
'devextreme/time_zone_utils.js': {
'esModule': true,
},
'devextreme/localization.js': {
'esModule': true,
},
'devextreme/viz/palette.js': {
'esModule': true,
},
},
paths: {
'root:': '../../../../',
'npm:': 'https://unpkg.com/',
},
map: {
'vue': 'npm:vue@3.2.47/dist/vue.esm-browser.js',
'vue-loader': 'npm:dx-systemjs-vue-browser@1.1.1/index.js',
'demo-ts-loader': 'root:utils/demo-ts-loader.js',
'svg-loader': 'root:utils/svg-loader.js',
'mitt': 'npm:mitt/dist/mitt.umd.js',
'rrule': 'npm:rrule@2.6.4/dist/es5/rrule.js',
'luxon': 'npm:luxon@1.28.1/build/global/luxon.min.js',
'es6-object-assign': 'npm:es6-object-assign@1.1.0',
'devextreme': 'npm:devextreme@24.1.7/cjs',
'devextreme-vue': 'npm:devextreme-vue@24.1.7/cjs',
'jszip': 'npm:jszip@3.10.1/dist/jszip.min.js',
'devextreme-quill': 'npm:devextreme-quill@1.7.1/dist/dx-quill.min.js',
'devexpress-diagram': 'npm:devexpress-diagram@2.2.13/dist/dx-diagram.js',
'devexpress-gantt': 'npm:devexpress-gantt@4.1.56/dist/dx-gantt.js',
'@devextreme/runtime': 'npm:@devextreme/runtime@3.0.13',
'inferno': 'npm:inferno@7.4.11/dist/inferno.min.js',
'inferno-compat': 'npm:inferno-compat/dist/inferno-compat.min.js',
'inferno-create-element': 'npm:inferno-create-element@7.4.11/dist/inferno-create-element.min.js',
'inferno-dom': 'npm:inferno-dom/dist/inferno-dom.min.js',
'inferno-hydrate': 'npm:inferno-hydrate@7.4.11/dist/inferno-hydrate.min.js',
'inferno-clone-vnode': 'npm:inferno-clone-vnode/dist/inferno-clone-vnode.min.js',
'inferno-create-class': 'npm:inferno-create-class/dist/inferno-create-class.min.js',
'inferno-extras': 'npm:inferno-extras/dist/inferno-extras.min.js',
'plugin-babel': 'npm:systemjs-plugin-babel@0.0.25/plugin-babel.js',
'systemjs-babel-build': 'npm:systemjs-plugin-babel@0.0.25/systemjs-babel-browser.js',
// Prettier
'prettier/standalone': 'npm:prettier@2.8.8/standalone.js',
'prettier/parser-html': 'npm:prettier@2.8.8/parser-html.js',
},
packages: {
'devextreme-vue': {
main: 'index.js',
},
'devextreme': {
defaultExtension: 'js',
},
'devextreme/events/utils': {
main: 'index',
},
'devextreme/events': {
main: 'index',
},
'es6-object-assign': {
main: './index.js',
defaultExtension: 'js',
},
},
packageConfigPaths: [
'npm:@devextreme/*/package.json',
'npm:@devextreme/runtime@3.0.13/inferno/package.json',
],
babelOptions: {
sourceMaps: false,
stage0: true,
},
};
System.config(window.config);
export type Order = {
ID: number;
OrderNumber: number;
OrderDate: string;
SaleAmount: number;
Terms: string;
CustomerInfo: {
StoreState: string;
StoreCity: string;
};
Employee: string;
};
export const orders: Order[] = [{
ID: 1,
OrderNumber: 35703,
OrderDate: '2014/04/10',
SaleAmount: 11800,
Terms: '15 Days',
Employee: 'Harv Mudd',
CustomerInfo: {
StoreState: 'California',
StoreCity: 'Los Angeles',
},
}, {
ID: 4,
OrderNumber: 35711,
OrderDate: '2014/01/12',
SaleAmount: 16050,
Terms: '15 Days',
Employee: 'Jim Packard',
CustomerInfo: {
StoreState: 'California',
StoreCity: 'San Jose',
},
}, {
ID: 5,
OrderNumber: 35714,
OrderDate: '2014/01/22',
SaleAmount: 14750,
Terms: '15 Days',
Employee: 'Harv Mudd',
CustomerInfo: {
StoreState: 'Nevada',
StoreCity: 'Las Vegas',
},
}, {
ID: 7,
OrderNumber: 35983,
OrderDate: '2014/02/07',
SaleAmount: 3725,
Terms: '15 Days',
Employee: 'Todd Hoffman',
CustomerInfo: {
StoreState: 'Colorado',
StoreCity: 'Denver',
},
}, {
ID: 9,
OrderNumber: 36987,
OrderDate: '2014/03/11',
SaleAmount: 14200,
Terms: '15 Days',
Employee: 'Clark Morgan',
CustomerInfo: {
StoreState: 'Utah',
StoreCity: 'Salt Lake City',
},
}, {
ID: 11,
OrderNumber: 38466,
OrderDate: '2014/03/01',
SaleAmount: 7800,
Terms: '15 Days',
Employee: 'Harv Mudd',
CustomerInfo: {
StoreState: 'California',
StoreCity: 'Los Angeles',
},
}, {
ID: 14,
OrderNumber: 39420,
OrderDate: '2014/02/15',
SaleAmount: 20500,
Terms: '15 Days',
Employee: 'Jim Packard',
CustomerInfo: {
StoreState: 'California',
StoreCity: 'San Jose',
},
}, {
ID: 15,
OrderNumber: 39874,
OrderDate: '2014/02/04',
SaleAmount: 9050,
Terms: '30 Days',
Employee: 'Harv Mudd',
CustomerInfo: {
StoreState: 'Nevada',
StoreCity: 'Las Vegas',
},
}, {
ID: 18,
OrderNumber: 42847,
OrderDate: '2014/02/15',
SaleAmount: 20400,
Terms: '30 Days',
Employee: 'Todd Hoffman',
CustomerInfo: {
StoreState: 'Wyoming',
StoreCity: 'Casper',
},
}, {
ID: 19,
OrderNumber: 43982,
OrderDate: '2014/05/29',
SaleAmount: 6050,
Terms: '30 Days',
Employee: 'Clark Morgan',
CustomerInfo: {
StoreState: 'Utah',
StoreCity: 'Salt Lake City',
},
}, {
ID: 29,
OrderNumber: 56272,
OrderDate: '2014/02/06',
SaleAmount: 15850,
Terms: '30 Days',
Employee: 'Clark Morgan',
CustomerInfo: {
StoreState: 'Utah',
StoreCity: 'Salt Lake City',
},
}, {
ID: 30,
OrderNumber: 57429,
OrderDate: '2014/05/16',
SaleAmount: 11050,
Terms: '30 Days',
Employee: 'Clark Morgan',
CustomerInfo: {
StoreState: 'Arizona',
StoreCity: 'Phoenix',
},
}, {
ID: 32,
OrderNumber: 58292,
OrderDate: '2014/05/13',
SaleAmount: 13500,
Terms: '15 Days',
Employee: 'Harv Mudd',
CustomerInfo: {
StoreState: 'California',
StoreCity: 'Los Angeles',
},
}, {
ID: 36,
OrderNumber: 62427,
OrderDate: '2014/01/27',
SaleAmount: 23500,
Terms: '15 Days',
Employee: 'Harv Mudd',
CustomerInfo: {
StoreState: 'Nevada',
StoreCity: 'Las Vegas',
},
}, {
ID: 39,
OrderNumber: 65977,
OrderDate: '2014/02/05',
SaleAmount: 2550,
Terms: '15 Days',
Employee: 'Todd Hoffman',
CustomerInfo: {
StoreState: 'Wyoming',
StoreCity: 'Casper',
},
}, {
ID: 40,
OrderNumber: 66947,
OrderDate: '2014/03/23',
SaleAmount: 3500,
Terms: '15 Days',
Employee: 'Clark Morgan',
CustomerInfo: {
StoreState: 'Utah',
StoreCity: 'Salt Lake City',
},
}, {
ID: 42,
OrderNumber: 68428,
OrderDate: '2014/04/10',
SaleAmount: 10500,
Terms: '15 Days',
Employee: 'Harv Mudd',
CustomerInfo: {
StoreState: 'California',
StoreCity: 'Los Angeles',
},
}, {
ID: 43,
OrderNumber: 69477,
OrderDate: '2014/03/09',
SaleAmount: 14200,
Terms: '15 Days',
Employee: 'Harv Mudd',
CustomerInfo: {
StoreState: 'California',
StoreCity: 'Anaheim',
},
}, {
ID: 46,
OrderNumber: 72947,
OrderDate: '2014/01/14',
SaleAmount: 13350,
Terms: '30 Days',
Employee: 'Harv Mudd',
CustomerInfo: {
StoreState: 'Nevada',
StoreCity: 'Las Vegas',
},
}, {
ID: 47,
OrderNumber: 73088,
OrderDate: '2014/03/25',
SaleAmount: 8600,
Terms: '30 Days',
Employee: 'Clark Morgan',
CustomerInfo: {
StoreState: 'Nevada',
StoreCity: 'Reno',
},
}, {
ID: 50,
OrderNumber: 76927,
OrderDate: '2014/04/27',
SaleAmount: 9800,
Terms: '30 Days',
Employee: 'Clark Morgan',
CustomerInfo: {
StoreState: 'Utah',
StoreCity: 'Salt Lake City',
},
}, {
ID: 51,
OrderNumber: 77297,
OrderDate: '2014/04/30',
SaleAmount: 10850,
Terms: '30 Days',
Employee: 'Clark Morgan',
CustomerInfo: {
StoreState: 'Arizona',
StoreCity: 'Phoenix',
},
}, {
ID: 56,
OrderNumber: 84744,
OrderDate: '2014/02/10',
SaleAmount: 4650,
Terms: '30 Days',
Employee: 'Harv Mudd',
CustomerInfo: {
StoreState: 'Nevada',
StoreCity: 'Las Vegas',
},
}, {
ID: 57,
OrderNumber: 85028,
OrderDate: '2014/05/17',
SaleAmount: 2575,
Terms: '30 Days',
Employee: 'Clark Morgan',
CustomerInfo: {
StoreState: 'Nevada',
StoreCity: 'Reno',
},
}, {
ID: 59,
OrderNumber: 87297,
OrderDate: '2014/04/21',
SaleAmount: 14200,
Terms: '30 Days',
Employee: 'Todd Hoffman',
CustomerInfo: {
StoreState: 'Wyoming',
StoreCity: 'Casper',
},
}, {
ID: 60,
OrderNumber: 88027,
OrderDate: '2014/02/14',
SaleAmount: 13650,
Terms: '30 Days',
Employee: 'Clark Morgan',
CustomerInfo: {
StoreState: 'Utah',
StoreCity: 'Salt Lake City',
},
}, {
ID: 65,
OrderNumber: 94726,
OrderDate: '2014/05/22',
SaleAmount: 20500,
Terms: '15 Days',
Employee: 'Jim Packard',
CustomerInfo: {
StoreState: 'California',
StoreCity: 'San Jose',
},
}, {
ID: 66,
OrderNumber: 95266,
OrderDate: '2014/03/10',
SaleAmount: 9050,
Terms: '15 Days',
Employee: 'Harv Mudd',
CustomerInfo: {
StoreState: 'Nevada',
StoreCity: 'Las Vegas',
},
}, {
ID: 69,
OrderNumber: 98477,
OrderDate: '2014/01/01',
SaleAmount: 23500,
Terms: '15 Days',
Employee: 'Todd Hoffman',
CustomerInfo: {
StoreState: 'Wyoming',
StoreCity: 'Casper',
},
}, {
ID: 70,
OrderNumber: 99247,
OrderDate: '2014/02/08',
SaleAmount: 2100,
Terms: '15 Days',
Employee: 'Clark Morgan',
CustomerInfo: {
StoreState: 'Utah',
StoreCity: 'Salt Lake City',
},
}, {
ID: 78,
OrderNumber: 174884,
OrderDate: '2014/04/10',
SaleAmount: 7200,
Terms: '30 Days',
Employee: 'Todd Hoffman',
CustomerInfo: {
StoreState: 'Colorado',
StoreCity: 'Denver',
},
}, {
ID: 81,
OrderNumber: 188877,
OrderDate: '2014/02/11',
SaleAmount: 8750,
Terms: '30 Days',
Employee: 'Clark Morgan',
CustomerInfo: {
StoreState: 'Arizona',
StoreCity: 'Phoenix',
},
}, {
ID: 82,
OrderNumber: 191883,
OrderDate: '2014/02/05',
SaleAmount: 9900,
Terms: '30 Days',
Employee: 'Harv Mudd',
CustomerInfo: {
StoreState: 'California',
StoreCity: 'Los Angeles',
},
}, {
ID: 83,
OrderNumber: 192474,
OrderDate: '2014/01/21',
SaleAmount: 12800,
Terms: '30 Days',
Employee: 'Harv Mudd',
CustomerInfo: {
StoreState: 'California',
StoreCity: 'Anaheim',
},
}, {
ID: 84,
OrderNumber: 193847,
OrderDate: '2014/03/21',
SaleAmount: 14100,
Terms: '30 Days',
Employee: 'Harv Mudd',
CustomerInfo: {
StoreState: 'California',
StoreCity: 'San Diego',
},
}, {
ID: 85,
OrderNumber: 194877,
OrderDate: '2014/03/06',
SaleAmount: 4750,
Terms: '30 Days',
Employee: 'Jim Packard',
CustomerInfo: {
StoreState: 'California',
StoreCity: 'San Jose',
},
}, {
ID: 86,
OrderNumber: 195746,
OrderDate: '2014/05/26',
SaleAmount: 9050,
Terms: '30 Days',
Employee: 'Harv Mudd',
CustomerInfo: {
StoreState: 'Nevada',
StoreCity: 'Las Vegas',
},
}, {
ID: 87,
OrderNumber: 197474,
OrderDate: '2014/03/02',
SaleAmount: 6400,
Terms: '30 Days',
Employee: 'Clark Morgan',
CustomerInfo: {
StoreState: 'Nevada',
StoreCity: 'Reno',
},
}, {
ID: 88,
OrderNumber: 198746,
OrderDate: '2014/05/09',
SaleAmount: 15700,
Terms: '30 Days',
Employee: 'Todd Hoffman',
CustomerInfo: {
StoreState: 'Colorado',
StoreCity: 'Denver',
},
}, {
ID: 91,
OrderNumber: 214222,
OrderDate: '2014/02/08',
SaleAmount: 11050,
Terms: '30 Days',
Employee: 'Clark Morgan',
CustomerInfo: {
StoreState: 'Arizona',
StoreCity: 'Phoenix',
},
}];
import { createApp } from 'vue';
import App from './App.vue';
createApp(App).mount('#app');
<!DOCTYPE html>
<html lang="en">
<head>
<title>DevExtreme Demo</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0" />
<link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/24.1.7/css/dx.light.css" />
<script type="module">
import * as vueCompilerSFC from "https://unpkg.com/@vue/compiler-sfc@3.4.16/dist/compiler-sfc.esm-browser.js";
window.vueCompilerSFC = vueCompilerSFC;
</script>
<script src="https://unpkg.com/typescript@4.9.5/lib/typescript.js"></script>
<script src="https://unpkg.com/core-js@2.6.12/client/shim.min.js"></script>
<script src="https://unpkg.com/systemjs@0.21.3/dist/system.js"></script>
<script type="text/javascript" src="config.js"></script>
<script type="text/javascript">
System.import("./index.ts");
</script>
</head>
<body class="dx-viewport">
<div class="demo-container">
<div id="app"> </div>
</div>
</body>
</html>
The intergrated filter builder is displayed in a pop-up window (the DevExtreme Popup component). Its default configuration is defined automatically, but you can change it in the filterBuilderPopup object. In this example, this object is used to specify the position of the pop-up window.