DevExtreme v25.1 is now available.

Explore our newest features/capabilities and share your thoughts with us.

Your search did not match any results.

Angular Card View - Filter Panel

The filter panel UI element displays combined filter information on-screen. This filter is stored in the filterValue property and includes filters applied in other UI elements (header filter, filterBuilder).

Backend API
<dx-card-view id="cardView" [dataSource]="orders" keyExpr="ID" [filterValue]="filterValue" cardsPerRow="auto" [cardMinWidth]="310" > <dxo-card-view-header-filter [visible]="true"></dxo-card-view-header-filter> <dxo-card-view-filter-panel [visible]="true"></dxo-card-view-filter-panel> <dxo-card-view-filter-builder [customOperations]="customOperations" ></dxo-card-view-filter-builder> <dxi-card-view-column dataField="OrderNumber"> <dxo-card-view-column-header-filter [groupInterval]="10000" ></dxo-card-view-column-header-filter> </dxi-card-view-column> <dxi-card-view-column dataField="OrderDate" dataType="date" ></dxi-card-view-column> <dxi-card-view-column dataField="DeliveryDate" dataType="date" ></dxi-card-view-column> <dxi-card-view-column dataField="SaleAmount" dataType="number"> <dxo-card-view-column-header-filter [dataSource]="saleAmountHeaderFilterDataSource" ></dxo-card-view-column-header-filter> </dxi-card-view-column> <dxi-card-view-column dataField="CustomerStoreCity" caption="City" ></dxi-card-view-column> <dxi-card-view-column dataField="Employee"></dxi-card-view-column> </dx-card-view>
import { NgModule, Component, enableProdMode } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; import { DxCardViewModule, DxCardViewTypes } from 'devextreme-angular/ui/card-view'; import { Order, Service } from './app.service'; if (!/localhost/.test(document.location.host)) { enableProdMode(); } let modulePrefix = ''; // @ts-ignore if (window && window.config?.packageConfigPaths) { modulePrefix = '/app'; } function getOrderDay({ OrderDate }: Order): number { return (new Date(OrderDate)).getDay(); }; @Component({ styleUrls: [`app/app.component.css`], selector: 'demo-app', templateUrl: `app/app.component.html`, providers: [Service], }) export class AppComponent { filterValue = [['Employee', '=', 'Clark Morgan'], 'and', ['DeliveryDate', 'weekends']]; customOperations = [{ name: 'weekends', caption: 'Weekends', dataTypes: ['date'], icon: 'check', hasValue: false, calculateFilterExpression() { return [[getOrderDay, '=', 0], 'or', [getOrderDay, '=', 6]]; }, }]; saleAmountHeaderFilterDataSource = [ { 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], }, ]; orders: Order[]; constructor(service: Service) { this.orders = service.getOrders(); } } @NgModule({ imports: [ BrowserModule, DxCardViewModule, ], declarations: [AppComponent], bootstrap: [AppComponent], }) export class AppModule { } platformBrowserDynamic().bootstrapModule(AppModule);
import { Injectable } from '@angular/core'; export interface Order { ID: number; OrderNumber: number; SaleAmount: number; CustomerStoreCity: string; Employee: string; OrderDate: string; DeliveryDate: string; Terms: string; } const orders: Order[] = [{ ID: 1, OrderNumber: 35703, OrderDate: '2017/04/10', DeliveryDate: '2017/04/13', SaleAmount: 11800, Terms: '15 Days', CustomerStoreCity: 'Los Angeles, CA', Employee: 'Harv Mudd', }, { ID: 4, OrderNumber: 35711, OrderDate: '2017/01/12', DeliveryDate: '2017/01/13', SaleAmount: 16050, Terms: '15 Days', CustomerStoreCity: 'San Jose, CA', Employee: 'Jim Packard', }, { ID: 5, OrderNumber: 35714, OrderDate: '2017/01/22', DeliveryDate: '2017/01/27', SaleAmount: 14750, Terms: '15 Days', CustomerStoreCity: 'Las Vegas, NV', Employee: 'Harv Mudd', }, { ID: 7, OrderNumber: 35983, OrderDate: '2017/02/07', DeliveryDate: '2017/02/10', SaleAmount: 3725, Terms: '15 Days', CustomerStoreCity: 'Denver, CO', Employee: 'Todd Hoffman', }, { ID: 11, OrderNumber: 38466, OrderDate: '2017/03/01', DeliveryDate: '2017/03/03', SaleAmount: 7800, Terms: '15 Days', CustomerStoreCity: 'Los Angeles, CA', Employee: 'Harv Mudd', }, { ID: 14, OrderNumber: 39420, OrderDate: '2017/02/15', DeliveryDate: '2017/02/17', SaleAmount: 20500, Terms: '15 Days', CustomerStoreCity: 'San Jose, CA', Employee: 'Jim Packard', }, { ID: 15, OrderNumber: 39874, OrderDate: '2017/02/04', DeliveryDate: '2017/02/10', SaleAmount: 9050, Terms: '30 Days', CustomerStoreCity: 'Las Vegas, NV', Employee: 'Harv Mudd', }, { ID: 18, OrderNumber: 42847, OrderDate: '2017/02/15', DeliveryDate: '2017/02/17', SaleAmount: 20400, Terms: '30 Days', CustomerStoreCity: 'Casper, WY', Employee: 'Todd Hoffman', }, { ID: 30, OrderNumber: 57429, OrderDate: '2017/05/16', DeliveryDate: '2017/05/19', SaleAmount: 11050, Terms: '30 Days', CustomerStoreCity: 'Phoenix, AZ', Employee: 'Clark Morgan', }, { ID: 32, OrderNumber: 58292, OrderDate: '2017/05/13', DeliveryDate: '2017/05/19', SaleAmount: 13500, Terms: '15 Days', CustomerStoreCity: 'Los Angeles, CA', Employee: 'Harv Mudd', }, { ID: 36, OrderNumber: 62427, OrderDate: '2017/01/27', DeliveryDate: '2017/02/03', SaleAmount: 23500, Terms: '15 Days', CustomerStoreCity: 'Las Vegas, NV', Employee: 'Harv Mudd', }, { ID: 39, OrderNumber: 65977, OrderDate: '2017/02/05', DeliveryDate: '2017/02/10', SaleAmount: 2550, Terms: '15 Days', CustomerStoreCity: 'Casper, WY', Employee: 'Todd Hoffman', }, { ID: 42, OrderNumber: 68428, OrderDate: '2017/04/10', DeliveryDate: '2017/04/14', SaleAmount: 10500, Terms: '15 Days', CustomerStoreCity: 'Los Angeles, CA', Employee: 'Harv Mudd', }, { ID: 43, OrderNumber: 69477, OrderDate: '2017/03/09', DeliveryDate: '2017/03/10', SaleAmount: 14200, Terms: '15 Days', CustomerStoreCity: 'Anaheim, CA', Employee: 'Harv Mudd', }, { ID: 46, OrderNumber: 72947, OrderDate: '2017/01/14', DeliveryDate: '2017/01/20', SaleAmount: 13350, Terms: '30 Days', CustomerStoreCity: 'Las Vegas, NV', Employee: 'Harv Mudd', }, { ID: 47, OrderNumber: 73088, OrderDate: '2017/03/25', DeliveryDate: '2017/03/31', SaleAmount: 8600, Terms: '30 Days', CustomerStoreCity: 'Reno, NV', Employee: 'Clark Morgan', }, { ID: 51, OrderNumber: 77297, OrderDate: '2017/04/30', DeliveryDate: '2017/05/05', SaleAmount: 10850, Terms: '30 Days', CustomerStoreCity: 'Phoenix, AZ', Employee: 'Clark Morgan', }, { ID: 56, OrderNumber: 84744, OrderDate: '2017/02/10', DeliveryDate: '2017/02/17', SaleAmount: 4650, Terms: '30 Days', CustomerStoreCity: 'Las Vegas, NV', Employee: 'Harv Mudd', }, { ID: 57, OrderNumber: 85028, OrderDate: '2017/05/17', DeliveryDate: '2017/05/19', SaleAmount: 2575, Terms: '30 Days', CustomerStoreCity: 'Reno, NV', Employee: 'Clark Morgan', }, { ID: 59, OrderNumber: 87297, OrderDate: '2017/04/21', DeliveryDate: '2017/04/28', SaleAmount: 14200, Terms: '30 Days', CustomerStoreCity: 'Casper, WY', Employee: 'Todd Hoffman', }, { ID: 65, OrderNumber: 94726, OrderDate: '2017/05/22', DeliveryDate: '2017/05/26', SaleAmount: 20500, Terms: '15 Days', CustomerStoreCity: 'San Jose, CA', Employee: 'Jim Packard', }, { ID: 66, OrderNumber: 95266, OrderDate: '2017/03/10', DeliveryDate: '2017/03/17', SaleAmount: 9050, Terms: '15 Days', CustomerStoreCity: 'Las Vegas, NV', Employee: 'Harv Mudd', }, { ID: 69, OrderNumber: 98477, OrderDate: '2017/01/01', DeliveryDate: '2017/01/06', SaleAmount: 23500, Terms: '15 Days', CustomerStoreCity: 'Casper, WY', Employee: 'Todd Hoffman', }, { ID: 78, OrderNumber: 174884, OrderDate: '2017/04/10', DeliveryDate: '2017/04/14', SaleAmount: 7200, Terms: '30 Days', CustomerStoreCity: 'Denver, CO', Employee: 'Todd Hoffman', }, { ID: 81, OrderNumber: 188877, OrderDate: '2017/02/11', DeliveryDate: '2017/02/17', SaleAmount: 8750, Terms: '30 Days', CustomerStoreCity: 'Phoenix, AZ', Employee: 'Clark Morgan', }, { ID: 82, OrderNumber: 191883, OrderDate: '2017/02/05', DeliveryDate: '2017/02/10', SaleAmount: 9900, Terms: '30 Days', CustomerStoreCity: 'Los Angeles, CA', Employee: 'Harv Mudd', }, { ID: 83, OrderNumber: 192474, OrderDate: '2017/01/21', DeliveryDate: '2017/01/27', SaleAmount: 12800, Terms: '30 Days', CustomerStoreCity: 'Anaheim, CA', Employee: 'Harv Mudd', }, { ID: 84, OrderNumber: 193847, OrderDate: '2017/03/21', DeliveryDate: '2017/03/24', SaleAmount: 14100, Terms: '30 Days', CustomerStoreCity: 'San Diego, CA', Employee: 'Harv Mudd', }, { ID: 85, OrderNumber: 194877, OrderDate: '2017/03/06', DeliveryDate: '2017/03/10', SaleAmount: 4750, Terms: '30 Days', CustomerStoreCity: 'San Jose, CA', Employee: 'Jim Packard', }, { ID: 86, OrderNumber: 195746, OrderDate: '2017/05/26', DeliveryDate: '2017/06/02', SaleAmount: 9050, Terms: '30 Days', CustomerStoreCity: 'Las Vegas, NV', Employee: 'Harv Mudd', }, { ID: 87, OrderNumber: 197474, OrderDate: '2017/03/02', DeliveryDate: '2017/03/03', SaleAmount: 6400, Terms: '30 Days', CustomerStoreCity: 'Reno, NV', Employee: 'Clark Morgan', }, { ID: 88, OrderNumber: 198746, OrderDate: '2017/05/09', DeliveryDate: '2017/05/12', SaleAmount: 15700, Terms: '30 Days', CustomerStoreCity: 'Denver, CO', Employee: 'Todd Hoffman', }, { ID: 91, OrderNumber: 214222, OrderDate: '2017/02/08', DeliveryDate: '2017/02/10', SaleAmount: 11050, Terms: '30 Days', CustomerStoreCity: 'Phoenix, AZ', Employee: 'Clark Morgan', }]; @Injectable() export class Service { getOrders() { 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>

To display the filter panel, set the filterPanel.visible property to true.

A click within the combined filter calls the integrated filter builder. You can configure its settings in the filterBuilder object. In this demo, this object is used to add beforeNoon and afterNoon custom filter operations.

The integrated filter builder displays in a DevExtreme Popup component. You can configure the filter builder popup with the filterBuilderPopup object.