JavaScript/jQuery TabPanel - Customize Item Appearance
An item in the TabPanel UI component includes a tab and a view. For a minor customization of TabPanel items, you can define specific fields in item data objects. For example, the following code generates three items: the first has a badge, the second is disabled, the third has an icon.
jQuery
$(function() {
$('#tabPanelContainer').dxTabPanel({
items: [{
title: 'Info',
text: 'This is Info Tab',
badge: 'New'
}, {
title: 'Contacts',
text: 'This is Contacts Tab',
disabled: true
}, {
title: 'Address',
text: 'This is Address Tab',
icon: 'home'
}]
});
});<div id="tabPanelContainer"></div>
Angular
<dx-tab-panel
[items]="tabPanelItems">
</dx-tab-panel>
import { DxTabPanelModule } from 'devextreme-angular';
// ...
export class AppComponent {
tabPanelItems = [{
title: 'Info',
text: 'This is Info Tab',
badge: 'New'
}, {
title: 'Contacts',
text: 'This is Contacts Tab',
disabled: true
}, {
title: 'Address',
text: 'This is Address Tab',
icon: 'home'
}];
}
@NgModule({
imports: [
// ...
DxTabPanelModule
],
// ...
})Vue
<template>
<DxTabPanel
:items="tabPanelItems" />
</template>
<script>
import 'devextreme/dist/css/dx.light.css';
import DxTabPanel from 'devextreme-vue/tab-panel';
export default {
components: {
DxTabPanel
},
data() {
return {
tabPanelItems: [{
title: 'Info',
text: 'This is Info Tab',
badge: 'New'
}, {
title: 'Contacts',
text: 'This is Contacts Tab',
disabled: true
}, {
title: 'Address',
text: 'This is Address Tab',
icon: 'home'
}]
};
}
};
</script>React
import React from 'react';
import 'devextreme/dist/css/dx.light.css';
import TabPanel from 'devextreme-react/tab-panel';
const tabPanelItems = [{
title: 'Info',
text: 'This is Info Tab',
badge: 'New'
}, {
title: 'Contacts',
text: 'This is Contacts Tab',
disabled: true
}, {
title: 'Address',
text: 'This is Address Tab',
icon: 'home'
}];
class App extends React.Component {
render() {
return (
<TabPanel
items={tabPanelItems}
/>
);
}
}
export default App;If you need a more flexible solution, define itemTemplate and itemTitleTemplate for views and tabs, respectively.
jQuery
var dataItems = [{
title: "Info",
data: { firstName: "John", lastName: "Smith", birthYear: 1986 }
}, {
title: "Contacts",
data: { phone: "(555)555-5555", email: "John.Smith@example.com" }
}];
$(function() {
$("#tabPanelContainer").dxTabPanel({
items: dataItems,
itemTitleTemplate: function(itemData, itemIndex, itemElement) {
itemElement.append("<p>" + itemData.title + "</p>");
},
itemTemplate: function(itemData, itemIndex, itemElement) {
var container = $("<div style='margin:25px;'>");
container.append("<h1>" + itemData.title + "</h1>");
var info = $("<div style='text-align:left;'>");
for (var field in itemData.data) {
info.append("<p>" + field + ": <b>" + itemData.data[field] + "</b></p>");
}
container.append(info);
itemElement.append(container);
}
});
});<div id="tabPanelContainer"></div>
Angular
<dx-tab-panel
[items]="tabPanelItems"
itemTitleTemplate="title"
itemTemplate="item">
<div *dxTemplate="let content of 'title'">
<p>{{content.title}}</p>
</div>
<div *dxTemplate="let content of 'item'">
<div style="margin: 25px;">
<h1>{{content.title}}</h1>
<div style="text-align: left;">
<p *ngFor="let key of getItemKeys(content.data)">
{{key}}: <b>{{content.data[key]}}</b>
</p>
</div>
</div>
</div>
</dx-tab-panel>
import { DxTabPanelModule } from 'devextreme-angular';
// ...
export class AppComponent {
tabPanelItems = [{
title: 'Info',
data: { firstName: 'John', lastName: 'Smith', birthYear: 1986 }
}, {
title: 'Contacts',
data: { phone: '(555)555-5555', email: 'John.Smith@example.com' }
}];
getItemKeys (item) {
return Object.keys(item);
}
}
@NgModule({
imports: [
// ...
DxTabPanelModule
],
// ...
})Vue
<template>
<DxTabPanel
:items="tabPanelItems"
item-title-template="title"
item-template="item">
<template #title="{ data }">
<div>
<p>{{ data.title }}</p>
</div>
</template>
<template #item="{ data }">
<div :style="{ margin: '25px' }">
<h1>{{data.title}}</h1>
<div :style="{ textAlign: 'left' }">
<p v-for="key in getItemKeys(data.data)">
{{key}}: <b>{{data.data[key]}}</b>
</p>
</div>
</div>
</template>
</DxTabPanel>
</template>
<script>
import 'devextreme/dist/css/dx.light.css';
import DxTabPanel from 'devextreme-vue/tab-panel';
export default {
components: {
DxTabPanel
},
data() {
return {
tabPanelItems: [{
title: 'Info',
data: { firstName: 'John', lastName: 'Smith', birthYear: 1986 }
}, {
title: 'Contacts',
data: { phone: '(555)555-5555', email: 'John.Smith@example.com' }
}]
};
},
methods: {
getItemKeys: function(item) {
return Object.keys(item);
}
}
};
</script>React
import React from 'react';
import 'devextreme/dist/css/dx.light.css';
import { TabPanel } from 'devextreme-react/tab-panel';
const tabPanelItems = [{
title: 'Info',
data: { firstName: 'John', lastName: 'Smith', birthYear: 1986 }
}, {
title: 'Contacts',
data: { phone: '(555)555-5555', email: 'John.Smith@example.com' }
}];
class App extends React.Component {
render() {
return (
<TabPanel
items={tabPanelItems}
itemTitleRender={this.renderTitle}
itemRender={this.renderItem}
/>
);
}
renderTitle(data) {
return (
<div>
<p>{data.title};</p>
</div>
);
}
renderItem(content) {
return (
<div style={{ margin: 25 }}>
<h1>{content.title}</h1>
<div style={{ textAlign: 'left' }}>
{
Object.keys(content.data).map(key => {
return (
<p key={key}>
{key}: <b>{content.data[key]}</b>
</p>
)}
)
}
</div>
</div>
);
}
}
export default App;jQuery
You can also customize individual items. Declare them as scripts and reference them in the template property or assign a customization function straight to this property.
$(function() {
$("#tabPanelContainer").dxTabPanel({
items: [{
title: "Info",
template: function() {
return $("<p>").text("This is Info Tab");
}
}, {
title: "Contacts",
template: $("#individualTemplate")
}]
});
});
<div id="tabPanelContainer"></div>
<script id="individualTemplate" type="text/html">
<p>This is Contacts Tab</p>
</script>Angular
You can also customize individual items. Declare them using the dxItem component.
<dx-tab-panel>
<dxi-item title="Info">
<p>This is Info Tab</p>
</dxi-item>
<dxi-item title="Contacts">
<p>This is Contacts Tab</p>
</dxi-item>
</dx-tab-panel>
import { DxTabPanelModule } from 'devextreme-angular';
// ...
export class AppComponent {
// ...
}
@NgModule({
imports: [
// ...
DxTabPanelModule
],
// ...
})Vue
You can also customize individual items. Declare them using the dxItem component.
<template>
<DxTabPanel>
<DxItem title="Info">
<template #default>
<p>This is Info Tab</p>
</template>
</DxItem>
<DxItem title="Contacts">
<template #default>
<p>This is Contacts Tab</p>
</template>
</DxItem>
</DxTabPanel>
</template>
<script>
import 'devextreme/dist/css/dx.light.css';
import DxTabPanel, { DxItem } from 'devextreme-vue/tab-panel';
export default {
components: {
DxTabPanel,
DxItem
}
};
</script>React
You can also customize individual items. Declare them using the dxItem component.
import React from 'react';
import 'devextreme/dist/css/dx.light.css';
import { TabPanel, Item } from 'devextreme-react/tab-panel';
class App extends React.Component {
render() {
return (
<TabPanel>
<Item title="Info">
<p>This is Info Tab</p>
</Item>
<Item title="Contacts">
<p>This is Contacts Tab</p>
</Item>
</TabPanel>
);
}
}
export default App;See Also
If you have technical questions, please create a support ticket in the DevExpress Support Center.