Skip to content

Commit 14c8624

Browse files
committed
Create POC for grid features as a nested directives
1 parent 8855d89 commit 14c8624

File tree

3 files changed

+89
-7
lines changed

3 files changed

+89
-7
lines changed

samples/igGrid-ComplexOpts/app.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
1-
import {Component, Inject, ElementRef, EventEmitter, HostListener} from '@angular/core';
2-
import {IgGridComponent, Column} from "../../src/igniteui.angular2.ts";
1+
import {Component, Directive, Inject, ElementRef, EventEmitter, HostListener} from '@angular/core';
2+
import {IgGridComponent, Column, Feature} from "../../src/igniteui.angular2.ts";
33
import {Northwind} from "./../data/northwind.ts";
44
import {bootstrap } from '@angular/platform-browser-dynamic';
5+
import {FORM_DIRECTIVES} from '@angular/common';
56

67
declare var jQuery: any;
8+
79
@Component({
810
selector: 'my-app',
911
templateUrl: "./igGrid-ComplexOptsTemplate.html",
10-
directives: [IgGridComponent, Column]
12+
directives: [IgGridComponent, Column, Feature, FORM_DIRECTIVES]
1113
})
1214
export class AppComponent {
1315
private cols: Array<any>;
@@ -16,6 +18,10 @@ export class AppComponent {
1618
private w: string;
1719
private h: string;
1820
private pKey: string;
21+
private isReadOnly: boolean = true;
22+
private cs: Array<any> = [{columnKey: "ProductID", readOnly: this.isReadOnly}];
23+
private pi: number = 0;
24+
private pages: Array<number> = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
1925

2026
constructor() {
2127
this.data = Northwind.getData();
Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
11
<div class="row">
22
<div class="col-md-12">
3-
<ig-grid [widgetId]='id' [width]='w' [autoCommit]='true' [dataSource]='data' [height]='h' [autoGenerateColumns]='false'>
4-
<column [key]="'ProductID'" [headerText]="'Product ID'" [width]="'65px'" [dataType]="'number'"></column>
3+
<ig-grid [widgetId]='id' [width]='w' [autoCommit]='true' [dataSource]='data' [height]='h' [autoGenerateColumns]='false' [primaryKey]='"ProductID"'>
4+
<column [key]="'ProductID'" [(headerText)]="idHeaderText" [width]="'165px'" [dataType]="'number'"></column>
55
<column [key]="'ProductName'" [headerText]="'Product Name'" [width]="'250px'" [dataType]="'string'"></column>
66
<column [key]="'QuantityPerUnit'" [headerText]="'Quantity per unit'" [width]="'250px'" [dataType]="'string'"></column>
77
<column [key]="'UnitPrice'" [headerText]="'Unit Price'" [width]="'100px'" [dataType]="'number'"></column>
8+
<feature [name]="'Updating'" [(columnSettings)]="cs"></feature>
9+
<feature [name]="'Paging'" [(currentPageIndex)]="pi" [pageSize]="'2'"></feature>
810
</ig-grid>
11+
12+
<br>
13+
<label for="pageIndex">Current Page Index:</label>
14+
<select [(ngModel)]="pi" name="pageIndex">
15+
<option *ngFor="let i of pages">{{i}}</option>
16+
</select>
917
</div>
18+
1019
</div>

src/igniteui.angular2.ts

Lines changed: 69 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,75 @@ var NODES = {
5353

5454
const _reflect: any = Reflect;
5555

56+
module IgUtil {
57+
export function extractAllGridFeatureOptions() {
58+
let allWidgets = jQuery.ui;
59+
let options = ["name"];
60+
let widget: any;
61+
for (widget in allWidgets) {
62+
if (widget.substring(0, 6) === "igGrid" && widget !== "igGrid") {
63+
options = options.concat(Object.keys(jQuery.ui[widget].prototype.options));
64+
}
65+
}
66+
return options;
67+
}
68+
}
69+
5670
@Directive({
5771
selector: 'column',
5872
inputs: ['headerText', 'key', 'formatter', 'format', 'dataType', 'width', 'hidden', 'template', 'unbound', 'group', 'rowspan', 'formula', 'unboundValues', 'unboundValuesUpdateMode', 'headerCssClass', 'columnCssClass']
5973
})
60-
export class Column {
61-
key:string;
74+
export class Column {}
75+
76+
@Directive({
77+
selector: 'feature',
78+
inputs: IgUtil.extractAllGridFeatureOptions()
79+
})
80+
81+
export class Feature {
82+
private _el: any;
83+
private _settings: any = {};
84+
@Input() public name: string;
85+
86+
constructor(el: ElementRef) {
87+
this._el = el;
88+
var self = this;
89+
let featureName = "igGrid" + this.name;
90+
for (var setting in jQuery.ui[featureName].prototype.options) {
91+
Object.defineProperty(self, setting, {
92+
set: self.createFeatureSetter(setting),
93+
get: self.createFeatureGetter(setting),
94+
enumerable: true,
95+
configurable: true
96+
});
97+
}
98+
}
99+
100+
ngOnInit() {
101+
102+
}
103+
104+
createFeatureSetter(name) {
105+
return function (value) {
106+
let grid = jQuery(this._el.nativeElement.parentElement).find("table[role='grid']");
107+
let featureName = "igGrid" + this.name;
108+
this._settings[name] = value;
109+
110+
if (this.name !== undefined && this.name !== null &&
111+
jQuery.ui[featureName] &&
112+
jQuery.ui[featureName].prototype.options &&
113+
jQuery.ui[featureName].prototype.options.hasOwnProperty(name) &&
114+
grid.data(featureName)) {
115+
grid[featureName]("option", name, value);
116+
}
117+
}
118+
}
119+
120+
createFeatureGetter(name) {
121+
return function () {
122+
return this._settings[name];
123+
}
124+
}
62125
}
63126

64127
export function IgComponent(args: any = {}) {
@@ -321,6 +384,7 @@ export class IgGridBase<Model> extends IgControlBase<Model> implements AfterCont
321384
protected _dataSource: any;
322385
protected _changes: any;
323386
@ContentChildren(Column) _columns: QueryList<Column>;
387+
@ContentChildren(Feature) _features: QueryList<Feature>;
324388

325389
constructor(el: ElementRef, renderer: Renderer, differs: IterableDiffers) { super(el, renderer, differs); }
326390

@@ -334,6 +398,9 @@ export class IgGridBase<Model> extends IgControlBase<Model> implements AfterCont
334398
if (this._columns.length) {
335399
this._opts["columns"] = this._columns.map((c) => c);
336400
}
401+
if (this._features.length) {
402+
this._opts["features"] = this._features.map((c) => c);
403+
}
337404
super.ngOnInit();
338405
}
339406

0 commit comments

Comments
 (0)