Skip to content

Commit 56df85f

Browse files
authored
Merge pull request #1570 from IgniteUI/mkirova/master-detail
Adding master-detail sample for grid
2 parents c91f670 + 989f403 commit 56df85f

9 files changed

+205
-5
lines changed

live-editing/configs/GridConfigGenerator.ts

+18-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ import {
2626
IgxSnackbarModule,
2727
IgxSwitchModule,
2828
IgxToastModule,
29-
IgxTooltipModule
29+
IgxTooltipModule,
30+
IgxTabsModule
3031
} from "igniteui-angular";
3132
// tslint:disable-next-line: max-line-length
3233
import { IgxSparklineCoreModule} from "igniteui-angular-charts/ES5/igx-sparkline-core-module";
@@ -212,6 +213,8 @@ import { RemoteServiceVirt } from "../../src/app/grid/services/remoteService";
212213
import { AppModuleConfig } from "./core/AppModuleConfig";
213214
import { Config } from "./core/Config";
214215
import { IConfigGenerator } from "./core/IConfigGenerator";
216+
import { GridMasterDetailSampleComponent } from '../../src/app/grid/grid-master-detail/grid-master-detail.component';
217+
import { IgxCategoryChartModule } from 'igniteui-angular-charts/ES5/igx-category-chart-module';
215218

216219
export class GridConfigGenerator implements IConfigGenerator {
217220
public generateConfigs(): Config[] {
@@ -549,6 +552,20 @@ export class GridConfigGenerator implements IConfigGenerator {
549552
})
550553
}));
551554

555+
// master-detail sample
556+
configs.push(new Config({
557+
component: GridMasterDetailSampleComponent,
558+
additionalFiles: ["/src/app/grid-crm/grid-crm/data.ts"],
559+
additionalDependencies: ["igniteui-angular-charts"],
560+
appModuleConfig: new AppModuleConfig({
561+
imports: [GridMasterDetailSampleComponent, IgxGridModule, IgxCategoryChartModule,
562+
IgxAvatarModule, IgxTabsModule],
563+
ngDeclarations: [GridMasterDetailSampleComponent],
564+
ngImports: [IgxGridModule, IgxIconModule],
565+
ngProviders: []
566+
})
567+
}));
568+
552569
configs.push(new Config({
553570
component: GridMovingStyledSampleComponent,
554571
additionalFiles: ["/src/app/grid/services/financialData.ts"],

package-lock.json

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<igx-grid displayDensity="cosy" [data]="data" [autoGenerate]="false" [height]="'600px'" [width]="'738px'">
2+
<igx-column field="name" header="Name" width="150px"></igx-column>
3+
<igx-column field="position" header="Position" width="200px"></igx-column>
4+
<igx-column field="company" header="Company" width="130px"></igx-column>
5+
<igx-column field="email" header="Email" width="240px"></igx-column>
6+
<ng-template igxGridDetail let-dataItem>
7+
<div style='width:100%;'>
8+
<igx-tabs>
9+
<igx-tabs-group label="Details">
10+
<div class='tabContent'>
11+
<igx-avatar src="https://www.infragistics.com/angular-demos/{{dataItem.avatar}}" roundShape="false" size="large"></igx-avatar>
12+
<div class='tabInnerContent'>
13+
<div>
14+
<div><span class='categoryStyle'>Country:</span> {{dataItem.country}}</div>
15+
<div><span class='categoryStyle'>City:</span> {{dataItem.city}}</div>
16+
<div><span class='categoryStyle'>Street:</span> {{dataItem.street}}</div>
17+
</div>
18+
<div>
19+
<div> <span class='categoryStyle'>Work Phone:</span> {{dataItem.work_phone}}</div>
20+
<div> <span class='categoryStyle'>Mobile Phone:</span> {{dataItem.mobile_phone}}</div>
21+
</div>
22+
</div>
23+
</div>
24+
</igx-tabs-group>
25+
<igx-tabs-group label="Deals">
26+
<div class='tabContent'>
27+
<igx-pie-chart [dataSource]="getPieData(dataItem)"
28+
width="50%"
29+
height="200px"
30+
[outlines]="['transparent']"
31+
leaderLineVisibility='collapsed'
32+
labelMemberPath="Label" [formatLabel]='formatPieLabel'
33+
valueMemberPath="Value" [brushes]='["rgb(171, 223, 29)", "rgb(228, 19, 16)", "rgb(0, 111, 138)"]'
34+
[labelsPosition]="'outsideEnd'">
35+
</igx-pie-chart>
36+
<igx-grid style='margin:10px;' displayDensity="compact" (onColumnInit)='columnInit($event)' [autoGenerate]='true' [columnWidth]='"70px"' width='260px' [data]='dataItem.gridData ? dataItem.gridData: gridData(dataItem)'>
37+
</igx-grid>
38+
</div>
39+
</igx-tabs-group>
40+
<igx-tabs-group label="Sales">
41+
<div class='tabContent' style='flex-direction: column;'>
42+
<igx-legend #legend orientation="horizontal"></igx-legend>
43+
<igx-category-chart height="300px" [legend]="legend"
44+
[dataSource]="dataItem.chartData ? dataItem.chartData : getChartData(dataItem)"
45+
chartType="Line"
46+
chartTitle="Sales"
47+
subtitle="(Estimated, Actual)"
48+
xAxisInterval="1"
49+
[brushes]='["rgb(0, 111, 138)", "rgb(171, 223, 29)"]'
50+
[xAxisFormatLabel]="formatDateLabel"
51+
[includedProperties]="include"
52+
[crosshairsDisplayMode]="'Horizontal'"
53+
[crosshairsAnnotationEnabled]="true"
54+
isHorizontalZoomEnabled="false"
55+
isVerticalZoomEnabled="false">
56+
</igx-category-chart>
57+
</div>
58+
</igx-tabs-group>
59+
</igx-tabs>
60+
</div>
61+
</ng-template>
62+
</igx-grid>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
.categoryStyle{
2+
font-weight: 600;
3+
}
4+
.tabContent {
5+
display:flex;
6+
justify-content: space-between;
7+
margin: 10px;
8+
}
9+
10+
.tabInnerContent {
11+
display:flex;
12+
justify-content: space-around;
13+
width: 100%;
14+
}
15+
.tabInnerContent > div {
16+
margin: 10px;
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import { Component, ViewChild } from "@angular/core";
2+
import { IgxColumnComponent } from "igniteui-angular";
3+
import { IgxLegendComponent } from "igniteui-angular-charts/ES5/igx-legend-component";
4+
import { data } from "../../grid-crm/grid-crm/data";
5+
6+
@Component({
7+
selector: "grid-master-detail",
8+
styleUrls: ["./grid-master-detail.component.scss"],
9+
templateUrl: "grid-master-detail.component.html"
10+
})
11+
12+
export class GridMasterDetailSampleComponent {
13+
@ViewChild("legend", { static: true })
14+
public legend: IgxLegendComponent;
15+
16+
public data = [];
17+
public include = ["date", "estimated", "actual"];
18+
constructor() {
19+
this.data = data;
20+
}
21+
22+
public formatPieLabel = (args) => {
23+
return args.item.Value + " " + args.item.Label;
24+
}
25+
26+
public formatDateLabel(item: any): string {
27+
return item.date.toLocaleDateString(undefined, {month: "short"});
28+
}
29+
30+
public formatValue(val: any): string {
31+
return val.toLocaleString("en-us", { maximumFractionDigits: 2 });
32+
}
33+
public getPieData(dataItem) {
34+
return [
35+
{ Label: "Won", Value: dataItem.deals_won},
36+
{ Label: "Lost", Value: dataItem.deals_lost},
37+
{ Label: "Pending", Value: dataItem.deals_pending}];
38+
}
39+
40+
public getChartData(dataItem) {
41+
const year: number = new Date().getFullYear();
42+
const sales: any[] = [];
43+
for (let i = 0; i < 12; i++) {
44+
const value = this.getRandomNumber(2000, 10000);
45+
sales.push({
46+
estimated: value + this.getRandomNumber(-2000 , 1000),
47+
actual: value, date: new Date(year, i, 1) });
48+
}
49+
dataItem.chartData = sales;
50+
return dataItem.chartData;
51+
}
52+
53+
public gridData(dataItem) {
54+
const detailsData = [];
55+
let won = dataItem.deals_won;
56+
let lost = dataItem.deals_lost;
57+
let pending = dataItem.deals_pending;
58+
for (let j = 0; j < 3; j++) {
59+
detailsData.push({
60+
Q: "Q" + (j + 1),
61+
Won: this.getRandomNumber(0, won),
62+
Lost: this.getRandomNumber(0, lost),
63+
Pending: this.getRandomNumber(0, pending)
64+
});
65+
won -= detailsData[j].Won;
66+
lost -= detailsData[j].Lost;
67+
pending -= detailsData[j].Pending;
68+
}
69+
detailsData.push({
70+
Q: "Q4",
71+
Won: won,
72+
Lost: lost,
73+
Pending: pending
74+
});
75+
dataItem.gridData = detailsData;
76+
return dataItem.gridData;
77+
}
78+
79+
public columnInit(event: IgxColumnComponent) {
80+
if (event.field === "Q") {
81+
event.width = "50px";
82+
event.header = " ";
83+
}
84+
}
85+
86+
public getRandomNumber(min: number, max: number): number {
87+
return Math.round(min + Math.random() * (max - min));
88+
}
89+
90+
}

src/app/grid/grid-routes-data.ts

+1
Original file line numberDiff line numberDiff line change
@@ -86,5 +86,6 @@ export const gridsRoutesData = {
8686
{ displayName: "Grid Excel Style Filtering Load On Demand", parentName: "Grid" },
8787
"grid-conditional-row-selectors": { displayName: "Grid Conditional Row Selectors", parentName: "Grid" },
8888
"grid-dynamic-chart-data": { displayName: "Grid Dynamic Chart Data", parentName: "Grid" },
89+
"grid-master-detail": { displayName: "Grid Master Detail", parentName: "Grid" },
8990
"grid-multiple-row-drag": { displayName: "Grid Multi Row Drag", parentName: "Grid"}
9091
};

src/app/grid/grids-routing.module.ts

+6
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ import {
8383
import { GridDynamicChartDataComponent } from "./grid-dynamic-chart-data/grid-dynamic-chart-data.component";
8484
import { GridEditingEventsComponent } from "./grid-editing-events/grid-editing-events.component";
8585
import { GridEditingStyleSample } from "./grid-editing-style-sample/grid-editing-style-sample.component";
86+
import { GridMasterDetailSampleComponent } from "./grid-master-detail/grid-master-detail.component";
8687
import { GridMRLCustomNavigationComponent } from "./grid-mrl-custom-navigation/grid-mrl-custom-navigation.component";
8788
import { GridMultipleRowDragComponent } from "./grid-multiple-row-drag/grid-multiple-row-drag.component";
8889
import { GridPagerSampleComponent } from "./grid-pager-sample/grid-pager-sample.component";
@@ -514,6 +515,11 @@ export const gridsRoutes: Routes = [
514515
component: GridDynamicChartDataComponent,
515516
data: gridsRoutesData["grid-dynamic-chart-data"],
516517
path: "grid-dynamic-chart-data"
518+
},
519+
{
520+
component: GridMasterDetailSampleComponent,
521+
data: gridsRoutesData["grid-master-detail"],
522+
path: "grid-master-detail"
517523
}
518524
];
519525

src/app/grid/grids.module.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
} from "igniteui-angular";
1313
import { IgxBarSeriesModule} from "igniteui-angular-charts/ES5/igx-bar-series-module";
1414
import { IgxBollingerBandsOverlayModule } from "igniteui-angular-charts/ES5/igx-bollinger-bands-overlay-module";
15+
import { IgxCategoryChartModule } from "igniteui-angular-charts/ES5/igx-category-chart-module";
1516
import { IgxCategoryXAxisComponent } from "igniteui-angular-charts/ES5/igx-category-x-axis-component";
1617
import { IgxCategoryXAxisModule } from "igniteui-angular-charts/ES5/igx-category-x-axis-module";
1718
import { IgxDataChartCategoryModule } from "igniteui-angular-charts/ES5/igx-data-chart-category-module";
@@ -79,6 +80,7 @@ import { GridGroupBySampleComponent } from "./grid-groupby-sample/grid-groupby-s
7980
import { GridGroupByStyling } from "./grid-groupby-styling/grid-groupby-styling.component";
8081
import { GridGroupBySummarySampleComponent } from "./grid-groupby-summary-sample/grid-groupby-summary-sample.component";
8182
import { GridGroupBySummaryStylingSampleComponent } from "./grid-groupby-summary-styling-sample/grid-groupby-summary-styling-sample.component";
83+
import { GridMasterDetailSampleComponent } from "./grid-master-detail/grid-master-detail.component";
8284
import { GridMovingSampleComponent } from "./grid-moving-sample/grid-moving-sample.component";
8385
import { GridMovingStyledSampleComponent } from "./grid-moving-styled-sample/grid-moving-styled-sample.component";
8486
import { GridMRLCustomNavigationComponent } from "./grid-mrl-custom-navigation/grid-mrl-custom-navigation.component";
@@ -223,6 +225,7 @@ import { DataService } from "./services/data.service";
223225
GridMultipleRowDragComponent,
224226
ChartHostDirective,
225227
ChartArgsPipe,
228+
GridMasterDetailSampleComponent,
226229
GridExternalAdvancedFilteringComponent
227230
],
228231
imports: [
@@ -277,7 +280,8 @@ import { DataService } from "./services/data.service";
277280
IgxCardModule,
278281
IgxDividerModule,
279282
IgxDataChartScatterModule,
280-
IgxBarSeriesModule
283+
IgxBarSeriesModule,
284+
IgxCategoryChartModule
281285
],
282286
providers: [
283287
DataService,

src/app/hierarchical-grid/hierarchical-grid.module.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import { FormsModule } from "@angular/forms";
66
import { IgxAvatarModule, IgxBadgeModule, IgxBannerModule, IgxButtonGroupModule, IgxButtonModule, IgxCheckboxModule, IgxChipsModule, IgxColumnHidingModule,
77
IgxComboModule, IgxCsvExporterService, IgxDatePickerModule, IgxDialogModule, IgxExcelExporterService, IgxFocusModule, IgxGridModule, IgxHierarchicalGridModule,
88
IgxIconModule, IgxInputGroupModule, IgxProgressBarModule, IgxRadioModule, IgxRippleModule, IgxSelectModule, IgxSliderModule, IgxSnackbarModule, IgxSwitchModule,
9-
IgxToastModule, IgxToggleModule } from "igniteui-angular";
9+
IgxTabsModule, IgxToastModule, IgxToggleModule } from "igniteui-angular";
10+
import { IgxPieChartModule} from "igniteui-angular-charts/ES5/igx-pie-chart-module";
1011
import { IgxSparklineCoreModule } from "igniteui-angular-charts/ES5/igx-sparkline-core-module";
1112
import { IgxSparklineModule } from "igniteui-angular-charts/ES5/igx-sparkline-module";
1213
import { HGridAdvancedFilteringStyleComponent } from "./hierarchical-grid-advanced-filtering-style/hierarchical-grid-advanced-filtering-style.component";
@@ -159,7 +160,9 @@ import { HGridToolbarTitleSampleComponent } from "./hierarchical-grid-toolbar/hi
159160
IgxSparklineModule,
160161
IgxSparklineCoreModule,
161162
IgxBannerModule,
162-
IgxSnackbarModule
163+
IgxSnackbarModule,
164+
IgxTabsModule,
165+
IgxPieChartModule
163166
],
164167
providers: [
165168
IgxCsvExporterService,

0 commit comments

Comments
 (0)