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
<dx-data-grid
id="gridContainer"
[dataSource]="dataSource"
keyExpr="ID"
[filterValue]="filterValue"
[showBorders]="true"
>
<dxo-filter-panel [visible]="true"></dxo-filter-panel>
<dxo-filter-builder
[customOperations]="customOperations"
[allowHierarchicalFields]="true"
>
</dxo-filter-builder>
<dxo-filter-builder-popup [position]="popupPosition">
</dxo-filter-builder-popup>
<dxo-filter-row [visible]="true"></dxo-filter-row>
<dxo-header-filter [visible]="true"></dxo-header-filter>
<dxo-scrolling mode="infinite"></dxo-scrolling>
<dxi-column
dataField="OrderNumber"
caption="Invoice Number"
dataType="number"
>
<dxo-header-filter [groupInterval]="10000"></dxo-header-filter>
</dxi-column>
<dxi-column dataField="OrderDate" dataType="date"></dxi-column>
<dxi-column
dataField="SaleAmount"
format="currency"
dataType="number"
[editorOptions]="{
format: 'currency',
showClearButton: true,
inputAttr: { 'aria-label': 'Filter cell' }
}"
>
<dxo-header-filter
[dataSource]="saleAmountHeaderFilter"
></dxo-header-filter>
</dxi-column>
<dxi-column dataField="Employee" dataType="string"></dxi-column>
<dxi-column
dataField="CustomerInfo.StoreCity"
caption="City"
dataType="string"
></dxi-column>
<dxi-column
dataField="CustomerInfo.StoreState"
caption="State"
dataType="string"
></dxi-column>
</dx-data-grid>
import { NgModule, Component, enableProdMode } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { PositionConfig } from 'devextreme-angular/common/core/animation';
import { DxFilterBuilderTypes } from 'devextreme-angular/ui/filter-builder';
import { DxoHeaderFilterComponent } from 'devextreme-angular/ui/nested/header-filter';
import { DxDataGridModule } from 'devextreme-angular/ui/data-grid';
import { Order, Service } from './app.service';
if (!/localhost/.test(document.location.host)) {
enableProdMode();
}
const getOrderDay = function ({ OrderDate }): number {
return (new Date(OrderDate)).getDay();
};
let modulePrefix = '';
// @ts-ignore
if (window && window.config?.packageConfigPaths) {
modulePrefix = '/app';
}
@Component({
selector: 'demo-app',
providers: [Service],
templateUrl: `app/app.component.html`,
styleUrls: [`app/app.component.css`],
})
export class AppComponent {
dataSource: Order[];
popupPosition: PositionConfig = {
of: window, at: 'top', my: 'top', offset: { y: 10 },
};
filterValue = [
['Employee', '=', 'Clark Morgan'],
'and',
['OrderDate', 'weekends'],
];
customOperations: DxFilterBuilderTypes.CustomOperation[] = [{
name: 'weekends',
caption: 'Weekends',
dataTypes: ['date'],
icon: 'check',
hasValue: false,
calculateFilterExpression() {
return [[getOrderDay, '=', 0], 'or', [getOrderDay, '=', 6]];
},
}];
saleAmountHeaderFilter: DxoHeaderFilterComponent['dataSource'] = [{
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],
}];
constructor(service: Service) {
this.dataSource = service.getOrders();
}
}
@NgModule({
imports: [
BrowserModule,
DxDataGridModule,
],
declarations: [AppComponent],
bootstrap: [AppComponent],
})
export class AppModule { }
platformBrowserDynamic().bootstrapModule(AppModule);
::ng-deep .demo-container {
height: 570px;
}
::ng-deep #gridContainer {
height: 440px;
}
::ng-deep .dx-filterbuilder-overlay .dx-scrollable-container {
max-height: 400px;
}
import { Injectable } from '@angular/core';
export class Order {
ID: number;
OrderNumber: number;
OrderDate: string;
SaleAmount: number;
Terms: string;
CustomerInfo: {
StoreState: string;
StoreCity: string;
};
Employee: string;
}
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',
},
}];
@Injectable()
export class Service {
getOrders(): Order[] {
return orders;
}
}
// In real applications, you should not transpile code in the browser.
// You can see how to create your own application with Angular and DevExtreme here:
// https://js.devexpress.com/Documentation/Guide/Angular_Components/Getting_Started/Create_a_DevExtreme_Application/
const componentNames = [
'accordion',
'action-sheet',
'autocomplete',
'bar-gauge',
'box',
'bullet',
'button-group',
'button',
'calendar',
'card-view',
'chart',
'chat',
'check-box',
'circular-gauge',
'color-box',
'context-menu',
'data-grid',
'date-box',
'date-range-box',
'defer-rendering',
'diagram',
'draggable',
'drawer',
'drop-down-box',
'drop-down-button',
'file-manager',
'file-uploader',
'filter-builder',
'form',
'funnel',
'gallery',
'gantt',
'html-editor',
'linear-gauge',
'list',
'load-indicator',
'load-panel',
'lookup',
'map',
'menu',
'multi-view',
'nested',
'number-box',
'pagination',
'pie-chart',
'pivot-grid-field-chooser',
'pivot-grid',
'polar-chart',
'popover',
'popup',
'progress-bar',
'radio-group',
'range-selector',
'range-slider',
'recurrence-editor',
'resizable',
'responsive-box',
'sankey',
'scheduler',
'scroll-view',
'select-box',
'slider',
'sortable',
'sparkline',
'speed-dial-action',
'splitter',
'stepper',
'switch',
'tab-panel',
'tabs',
'tag-box',
'text-area',
'text-box',
'tile-view',
'toast',
'toolbar',
'tooltip',
'tree-list',
'tree-map',
'tree-view',
'validation-group',
'validation-summary',
'validator',
'vector-map',
];
window.exports = window.exports || {};
window.config = {
transpiler: 'ts',
typescriptOptions: {
module: 'system',
emitDecoratorMetadata: true,
experimentalDecorators: true,
},
meta: {
'typescript': {
'exports': 'ts',
},
'devextreme/time_zone_utils.js': {
'esModule': true,
},
'devextreme/localization.js': {
'esModule': true,
},
'devextreme/viz/palette.js': {
'esModule': true,
},
'@angular/platform-browser-dynamic': {
'esModule': true,
},
'@angular/platform-browser': {
'esModule': true,
},
'@angular/core': {
'esModule': true,
},
'@angular/common': {
'esModule': true,
},
'@angular/common/http': {
'esModule': true,
},
'@angular/animations': {
'esModule': true,
},
'@angular/forms': {
'esModule': true,
},
'openai': {
'esModule': true,
},
},
paths: {
'npm:': 'https://cdn.jsdelivr.net/npm/',
'bundles:': '../../../../bundles/',
'externals:': '../../../../bundles/externals/',
},
map: {
'ts': 'npm:plugin-typescript@8.0.0/lib/plugin.js',
'typescript': 'npm:typescript@4.2.4/lib/typescript.js',
'jszip': 'npm:jszip@3.10.1/dist/jszip.min.js',
/* @angular */
'@angular/compiler': 'bundles:@angular/compiler.umd.js',
'@angular/platform-browser-dynamic': 'bundles:@angular/platform-browser-dynamic.umd.js',
'@angular/core': 'bundles:@angular/core.umd.js',
'@angular/core/primitives/signals': 'bundles:@angular/core.primitives.signals.umd.js',
'@angular/common': 'bundles:@angular/common.umd.js',
'@angular/common/http': 'bundles:@angular/common-http.umd.js',
'@angular/platform-browser': 'bundles:@angular/platform-browser.umd.js',
'@angular/platform-browser/animations': 'bundles:@angular/platform-browser.umd.js',
'@angular/forms': 'bundles:@angular/forms.umd.js',
/* devextreme */
'devextreme': 'npm:devextreme@25.1.3/cjs',
'devextreme-quill': 'npm:devextreme-quill@1.7.3/dist/dx-quill.min.js',
'devexpress-diagram': 'npm:devexpress-diagram@2.2.19',
'devexpress-gantt': 'npm:devexpress-gantt@4.1.62',
/* devextreme-angular umd maps */
'devextreme-angular': 'bundles:devextreme-angular/devextreme-angular.umd.js',
'devextreme-angular/common/ai-integration': 'bundles:devextreme-angular/devextreme-angular-common-ai-integration.umd.js',
'devextreme-angular/core': 'bundles:devextreme-angular/devextreme-angular-core.umd.js',
'devextreme-angular/common/charts': 'bundles:devextreme-angular/devextreme-angular-common-charts.umd.js',
'devextreme-angular/common/core/animation': 'bundles:devextreme-angular/devextreme-angular-common-core-animation.umd.js',
'devextreme-angular/common/core/environment': 'bundles:devextreme-angular/devextreme-angular-common-core-environment.umd.js',
'devextreme-angular/common/core/events': 'bundles:devextreme-angular/devextreme-angular-common-core-events.umd.js',
'devextreme-angular/common/core/localization': 'bundles:devextreme-angular/devextreme-angular-common-core-localization.umd.js',
'devextreme-angular/common/core': 'bundles:devextreme-angular/devextreme-angular-common-core.umd.js',
'devextreme-angular/common/data/custom-store': 'bundles:devextreme-angular/devextreme-angular-common-data-custom-store.umd.js',
'devextreme-angular/common/data': 'bundles:devextreme-angular/devextreme-angular-common-data.umd.js',
'devextreme-angular/common/export/excel': 'bundles:devextreme-angular/devextreme-angular-common-export-excel.umd.js',
'devextreme-angular/common/export/pdf': 'bundles:devextreme-angular/devextreme-angular-common-export-pdf.umd.js',
'devextreme-angular/common/export': 'bundles:devextreme-angular/devextreme-angular-common-export.umd.js',
'devextreme-angular/common/grids': 'bundles:devextreme-angular/devextreme-angular-common-grids.umd.js',
'devextreme-angular/common': 'bundles:devextreme-angular/devextreme-angular-common.umd.js',
'devextreme-angular/http': 'bundles:devextreme-angular/devextreme-angular-http.umd.js',
...componentNames.reduce((acc, name) => {
acc[`devextreme-angular/ui/${name}`] = `bundles:devextreme-angular/devextreme-angular-ui-${name}.umd.js`;
acc[`devextreme-angular/ui/${name}/nested`] = `bundles:devextreme-angular/devextreme-angular-ui-${name}-nested.umd.js`;
return acc;
}, {}),
'tslib': 'npm:tslib/tslib.js',
'rxjs': 'npm:rxjs@7.5.3/dist/bundles/rxjs.umd.js',
'rxjs/operators': 'npm:rxjs@7.5.3/dist/cjs/operators/index.js',
'rrule': 'npm:rrule@2.6.4/dist/es5/rrule.js',
'luxon': 'npm:luxon@3.4.4/build/global/luxon.min.js',
'es6-object-assign': 'npm:es6-object-assign',
'inferno': 'npm:inferno@8.2.3/dist/inferno.min.js',
'inferno-compat': 'npm:inferno-compat/dist/inferno-compat.min.js',
'inferno-create-element': 'npm:inferno-create-element@8.2.3/dist/inferno-create-element.min.js',
'inferno-dom': 'npm:inferno-dom/dist/inferno-dom.min.js',
'inferno-hydrate': 'npm:inferno-hydrate/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',
'@preact/signals-core': 'npm:@preact/signals-core@1.8.0/dist/signals-core.min.js',
// Prettier
'prettier/standalone': 'npm:prettier@2.8.8/standalone.js',
'prettier/parser-html': 'npm:prettier@2.8.8/parser-html.js',
},
packages: {
'app': {
main: './app.component.ts',
defaultExtension: 'ts',
},
'devextreme': {
defaultExtension: 'js',
},
'devextreme/events/utils': {
main: 'index',
},
'devextreme/common/core/events/utils': {
main: 'index',
},
'devextreme/events': {
main: 'index',
},
'es6-object-assign': {
main: './index.js',
defaultExtension: 'js',
},
'rxjs': {
defaultExtension: 'js',
},
'rxjs/operators': {
defaultExtension: 'js',
},
},
packageConfigPaths: [
'npm:@devextreme/*/package.json',
'npm:rxjs@7.5.3/package.json',
'npm:rxjs@7.5.3/operators/package.json',
'npm:devexpress-diagram@2.2.19/package.json',
'npm:devexpress-gantt@4.1.62/package.json',
],
};
System.config(window.config);
// System.import('@angular/compiler').catch(console.error.bind(console));
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" 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/25.1.3/css/dx.light.css" />
<script src="https://cdn.jsdelivr.net/npm/core-js@2.6.12/client/shim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/zone.js@0.14.10/bundles/zone.umd.js"></script>
<script src="https://cdn.jsdelivr.net/npm/reflect-metadata@0.1.13/Reflect.js"></script>
<script src="https://cdn.jsdelivr.net/npm/systemjs@0.21.3/dist/system.js"></script>
<script src="config.js"></script>
<script>
System.import("app").catch(console.error.bind(console));
</script>
</head>
<body class="dx-viewport">
<div class="demo-container">
<demo-app>Loading...</demo-app>
</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.