import { State, process } from '@progress/kendo-data-query';
import { Component, Renderer2, NgZone, AfterViewInit, OnInit, EventEmitter, OnDestroy } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/fromEvent';
import { Subscription } from 'rxjs/Subscription';
import { HttpClient, HttpParams} from '@angular/common/http';
import { FormGroup, FormControl, Validators } from '@angular/forms';

@Component({
    selector: 'my-app',
    template: `
      <form novalidate #myForm="ngForm">
        <kendo-grid
            [data]="gridData"
            [height]="510"
            [pageable]="true"
            [skip]="state.skip"
            [pageSize]="state.take"
            [filter]="state.filter"
            [filterable]="true"
            (edit)="viewDetails($event)"
            (filterChange)="updateFilterEvent($event)"
            (dataStateChange)="dataStateChange($event)">
            <kendo-grid-column field="id" title="ID" width="60" [filterable]="false" [headerStyle]="{'background-color': '#337ab7','color': '#fff','line-height': '1.5em','text-align': 'center'}"
            [style]="{'text-align': 'center'}">
            </kendo-grid-column>
            <kendo-grid-column field="title" title="To Do" [headerStyle]="{'background-color': '#337ab7','color': '#fff','line-height': '1.5em','text-align': 'center'}"
            [style]="{'text-align': 'center'}">
            </kendo-grid-column>
            <kendo-grid-column field="completed" title="Done?" width="80" [filterable]="false" [headerStyle]="{'background-color': '#337ab7','color': '#fff','line-height': '1.5em','text-align': 'center'}"
            [style]="{'text-align': 'center'}">
                <ng-template kendoGridCellTemplate let-dataItem>
                    <input type="checkbox" [checked]="dataItem.completed" disabled/>
                </ng-template>
            </kendo-grid-column>
            <kendo-grid-command-column title="Commands"
            [headerStyle]="{'background-color': '#337ab7','color': '#fff','line-height': '1.5em','text-align': 'center'}">
              <ng-template kendoGridCellTemplate>
                  <button kendoGridEditCommand type="button" class="k-primary">View Data</button>
              </ng-template>
          </kendo-grid-command-column>
        </kendo-grid>
      </form>
      <hr>
      <div *ngIf="selectedItem !== undefined">
        <h4>The selected Item is:</h4>
        <p>ID: {{selectedItem.id}}</p>
        <p>Title: {{selectedItem.title}}</p>
        <p>Completed?: {{selectedItem.completed}}</p>
      </div>
    `
})
export class AppComponent implements OnInit, AfterViewInit, OnDestroy {
    userData: any[] = [];
    placeHolderArray: any[] = [];
    selectedItem;
    public state: State = {
        skip: 0,
        take: 10
    };
    public gridData: any = process(this.userData, this.state);
    private currentSubscription: Subscription;

    constructor(private renderer: Renderer2, private zone: NgZone, private _http: HttpClient) {}

    ngOnInit() {
      this.getUserData();  
    }
    
    public ngAfterViewInit(): void {
        this.currentSubscription = this.handleDragAndDrop();
    }

    public ngOnDestroy(): void {
        this.currentSubscription.unsubscribe();
    }

    public dataStateChange(state: State): void {
        this.state = state;
        this.gridData = process(this.userData, this.state);
        this.currentSubscription.unsubscribe();
        this.zone.onStable
            .take(1)
            .subscribe(() => this.currentSubscription = this.handleDragAndDrop());
    }

    private handleDragAndDrop(): Subscription {
        const sub = new Subscription(() => {});
        let draggedItemIndex;

        const tableRows = Array.from(document.querySelectorAll('.k-grid-content tr'));
        tableRows.forEach(item => {
            this.renderer.setAttribute(item, 'draggable', 'true');
            const dragStart = Observable.fromEvent(item, 'dragstart');
            const dragOver = Observable.fromEvent(item, 'dragover');
            const drop = Observable.fromEvent(item, 'drop');

            sub.add(dragStart
              .do(({ dataTransfer }) => {
                try {
			            // Firefox won't drag without setting data
			            dataTransfer.setData('application/json', {})
		            } catch (err) { 
			            // IE doesn't support MIME types in setData
		            }
              })
              .subscribe(({ target }) => {
                  draggedItemIndex = target.rowIndex;
              }));

            sub.add(dragOver.subscribe((e: any) => e.preventDefault()));

            sub.add(drop.subscribe((e: any) => {
                e.preventDefault();
                const dataItem = this.gridData.data.splice(draggedItemIndex, 1)[0];
                const dropIndex = e.target.closest('tr').rowIndex;
                this.zone.run(() =>
                    this.gridData.data.splice(dropIndex, 0, dataItem)
                );
                this.userData = this.gridData.data;
            }));
        });

        return sub;
    }
    
  getUserData() {
    return this._http.get('https://jsonplaceholder.typicode.com/todos')
    .subscribe((fetchedData) => {
      this.userData = fetchedData;
      this.dataStateChange(this.state);
    });
  }
  
  updateFilterEvent (eventData) {
    console.log(eventData);
    // this.userData = this.gridData.data;
    // this.dataStateChange(this.state);
  }
  
  viewDetails(eventData) {
    const index = eventData.rowIndex;
    this.selectedItem = this.userData[index];
    console.log(this.selectedItem);
  }
}
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { FormsModule } from '@angular/forms';
import { GridModule } from '@progress/kendo-angular-grid';
import { HttpClientModule } from '@angular/common/http';

import { AppComponent } from './app.component';

@NgModule({
  imports: [ BrowserModule, BrowserAnimationsModule, GridModule, FormsModule, HttpClientModule],
  declarations: [ AppComponent ],
  bootstrap: [ AppComponent ]
})

export class AppModule { }
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './ng.module';

enableProdMode();

const platform = platformBrowserDynamic();
platform.bootstrapModule(AppModule);
export const products = [
  {
	"ADDRESS_TYPE_ID": 1083,
	"ADDRESS_TYPE_NAME": "Another Dimension",
	"IS_DEFAULT": 0
}, {
	"ADDRESS_TYPE_ID": 1082,
	"ADDRESS_TYPE_NAME": "Another Planet",
	"IS_DEFAULT": 0
}, {
	"ADDRESS_TYPE_ID": 1085,
	"ADDRESS_TYPE_NAME": "Community Park",
	"IS_DEFAULT": 0
}, {
	"ADDRESS_TYPE_ID": 1089,
	"ADDRESS_TYPE_NAME": "Estate on Mars",
	"IS_DEFAULT": 0
}, {
	"ADDRESS_TYPE_ID": 1086,
	"ADDRESS_TYPE_NAME": "Farm House",
	"IS_DEFAULT": 0
}, {
	"ADDRESS_TYPE_ID": 1084,
	"ADDRESS_TYPE_NAME": "House Next Door",
	"IS_DEFAULT": 0
}, {
	"ADDRESS_TYPE_ID": 40,
	"ADDRESS_TYPE_NAME": "OFF Campus",
	"IS_DEFAULT": 0
}, {
	"ADDRESS_TYPE_ID": 41,
	"ADDRESS_TYPE_NAME": "ON Campus",
	"IS_DEFAULT": -1
}, {
	"ADDRESS_TYPE_ID": 38,
	"ADDRESS_TYPE_NAME": "Primary",
	"IS_DEFAULT": 0
}
];
System.config({
  "transpiler": "ts",
  "typescriptOptions": {
    "target": "es5",
    "module": "system",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": true,
    "suppressImplicitAnyIndexErrors": true
  },
  "bundles": {
    "https://unpkg.com/rxjs-system-bundle@5.5.2/Rx.system.min.js": [
      "rxjs",
      "rxjs/*",
      "rxjs/operator/*",
      "rxjs/observable/*",
      "rxjs/scheduler/*",
      "rxjs/symbol/*",
      "rxjs/add/operator/*",
      "rxjs/add/observable/*",
      "rxjs/util/*"
    ],
    "https://www.telerik.com/kendo-angular-ui/npm/node_modules/@progress/kendo-drawing/dist/systemjs/kendo-drawing.js": [
      "@progress/kendo-drawing",
      "@progress/kendo-drawing/*"
    ],
    "https://www.telerik.com/kendo-angular-ui/npm/node_modules/@progress/kendo-charts/dist/systemjs/kendo-charts.js": [
      "@progress/kendo-charts"
    ],
    "https://www.telerik.com/kendo-angular-ui/npm/node_modules/@progress/kendo-angular-charts/dist/systemjs/kendo-angular-charts.js": [
      "@progress/kendo-angular-charts"
    ],
    "https://www.telerik.com/kendo-angular-ui/npm/node_modules/@progress/kendo-angular-gauges/dist/systemjs/kendo-angular-gauges.js": [
      "@progress/kendo-angular-gauges"
    ],
    "https://www.telerik.com/kendo-angular-ui/npm/node_modules/@progress/kendo-angular-resize-sensor/dist/systemjs/kendo-angular-resize-sensor.js": [
      "@progress/kendo-angular-resize-sensor"
    ],
    "https://www.telerik.com/kendo-angular-ui/npm/node_modules/@telerik/kendo-intl/dist/systemjs/kendo-intl.js": [
      "@telerik/kendo-intl"
    ],
    "https://www.telerik.com/kendo-angular-ui/npm/node_modules/@progress/kendo-angular-intl/dist/systemjs/kendo-angular-intl.js": [
      "@progress/kendo-angular-intl"
    ]
  },
  "meta": {
    "typescript": {
      "exports": "ts"
    },
    "*.json": {
      "loader": "systemjs-json-plugin"
    }
  },
  "map": {
    "app": "app",
    "systemjs-json-plugin": "https://unpkg.com/systemjs-plugin-json@0.3.0",
    "@telerik": "https://www.telerik.com/kendo-angular-ui/npm/node_modules/@telerik",
    "@progress": "https://www.telerik.com/kendo-angular-ui/npm/node_modules/@progress",
    "cldr-data": "https://www.telerik.com/kendo-angular-ui/npm/node_modules/cldr-data",
    "@angular": "https://unpkg.com/@angular",
    "angular2-in-memory-web-api": "https://unpkg.com/angular2-in-memory-web-api",
    "hammerjs": "https://unpkg.com/hammerjs@2.0.8",
    "pako": "https://unpkg.com/pako@1.0.5",
    "ts": "https://unpkg.com/plugin-typescript@5.3.3/lib/plugin.js",
    "tslib": "https://unpkg.com/tslib@1.7.1",
    "typescript": "https://unpkg.com/typescript@2.4.2/lib/typescript.js",
    "@angular/common/http": "https://unpkg.com/@angular/common@5.0.0/bundles/common-http.umd.js",
    "@angular/platform-browser/animations": "https://unpkg.com/@angular/platform-browser@5.0.0/bundles/platform-browser-animations.umd.js",
    "@angular/animations/browser": "https://unpkg.com/@angular/animations@5.0.0/bundles/animations-browser.umd.js",
    "@angular/common": "https://unpkg.com/@angular/common@5.0.0",
    "@angular/compiler": "https://unpkg.com/@angular/compiler@5.0.0",
    "@angular/forms": "https://unpkg.com/@angular/forms@5.0.0",
    "@angular/core": "https://unpkg.com/@angular/core@5.0.0",
    "@angular/platform-browser": "https://unpkg.com/@angular/platform-browser@5.0.0",
    "@angular/platform-browser-dynamic": "https://unpkg.com/@angular/platform-browser-dynamic@5.0.0",
    "@angular/upgrade": "https://unpkg.com/@angular/upgrade@5.0.0"
  },
  "packages": {
    "app": {
      "main": "./main.ts",
      "defaultExtension": "ts"
    },
    "rxjs": {
      "defaultExtension": false
    },
    "pako": {
      "defaultExtension": "js",
      "main": "./index.js"
    },
    "@angular/common": {
      "main": "/bundles/common.umd.js"
    },
    "@angular/compiler": {
      "main": "/bundles/compiler.umd.js"
    },
    "@angular/forms": {
      "main": "bundles/forms.umd.js",
      "defaultExtension": "js"
    },
    "@angular/core": {
      "main": "/bundles/core.umd.js"
    },
    "@angular/platform-browser": {
      "main": "/bundles/platform-browser.umd.js"
    },
    "@angular/platform-browser-dynamic": {
      "main": "/bundles/platform-browser-dynamic.umd.js"
    },
    "@angular/upgrade": {
      "main": "/bundles/upgrade.umd.js"
    },
    "@angular/animations": {
      "main": "/bundles/animations.umd.js"
    },
    "@progress/kendo-angular-buttons": {
      "main": "dist/cdn/js/kendo-angular-buttons.js",
      "defaultExtension": "js"
    },
    "@progress/kendo-angular-l10n": {
      "main": "dist/cdn/js/kendo-angular-l10n.js",
      "defaultExtension": "js"
    },
    "@progress/kendo-angular-inputs": {
      "main": "dist/cdn/js/kendo-angular-inputs.js",
      "defaultExtension": "js"
    },
    "@progress/kendo-data-query": {
      "main": "dist/cdn/js/kendo-data-query.js",
      "defaultExtension": "js"
    },
    "@progress/kendo-file-saver": {
      "main": "dist/npm/main.js",
      "defaultExtension": "js"
    },
    "@progress/kendo-angular-dateinputs": {
      "main": "dist/cdn/js/kendo-angular-dateinputs.js",
      "defaultExtension": "js"
    },
    "@progress/kendo-angular-dialog": {
      "main": "dist/cdn/js/kendo-angular-dialog.js",
      "defaultExtension": "js"
    },
    "@progress/kendo-angular-dropdowns": {
      "main": "dist/cdn/js/kendo-angular-dropdowns.js",
      "defaultExtension": "js"
    },
    "@progress/kendo-angular-grid": {
      "main": "dist/cdn/js/kendo-angular-grid.js",
      "defaultExtension": "js"
    },
    "@progress/kendo-angular-popup": {
      "main": "dist/cdn/js/kendo-angular-popup.js",
      "defaultExtension": "js"
    },
    "@progress/kendo-angular-label": {
      "main": "dist/cdn/js/kendo-angular-label.js",
      "defaultExtension": "js"
    },
    "@progress/kendo-angular-layout": {
      "main": "dist/cdn/js/kendo-angular-layout.js",
      "defaultExtension": "js"
    },
    "@progress/kendo-angular-ripple": {
      "main": "dist/cdn/js/kendo-angular-ripple.js",
      "defaultExtension": "js"
    },
    "@progress/kendo-angular-scrollview": {
      "main": "dist/cdn/js/kendo-angular-scrollview.js",
      "defaultExtension": "js"
    },
    "@progress/kendo-angular-sortable": {
      "main": "dist/cdn/js/kendo-angular-sortable.js",
      "defaultExtension": "js"
    },
    "@progress/kendo-angular-upload": {
      "main": "dist/cdn/js/kendo-angular-upload.js",
      "defaultExtension": "js"
    },
    "@progress/kendo-angular-excel-export": {
      "main": "dist/cdn/js/kendo-angular-excel-export.js",
      "defaultExtension": "js"
    },
    "@progress/kendo-angular-pdf-export": {
      "main": "dist/cdn/js/kendo-angular-pdf-export.js",
      "defaultExtension": "js"
    },
    "@progress/kendo-date-math": {
      "main": "dist/cdn/js/kendo-date-math.js",
      "defaultExtension": "js"
    },
    "@progress/kendo-react-inputs": {
      "main": "dist/cdn/js/kendo-react-inputs.js",
      "defaultExtension": "js"
    },
    "@progress/kendo-react-dateinputs": {
      "main": "dist/cdn/js/kendo-react-dateinputs.js",
      "defaultExtension": "js"
    },
    "@progress/kendo-angular-intl": {
      "defaultExtension": "js"
    }
  }
});
<!DOCTYPE html>
<html>
  <head>
    <title>Angular 2 QuickStart</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" integrity="sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ" crossorigin="anonymous">
    <link rel="stylesheet" href="https://www.telerik.com/kendo-angular-ui/npm/node_modules//@progress/kendo-theme-default/dist/all.css" />
    <!-- 1. Load libraries -->
    <!-- Polyfill(s) for older browsers -->
    <script src="https://unpkg.com/core-js/client/shim.min.js"></script>

    <script src="https://unpkg.com/zone.js@0.8.12/dist/zone.js"></script>
    <script src="https://unpkg.com/reflect-metadata@0.1.3/Reflect.js"></script>
    <script src="https://unpkg.com/systemjs@0.19.27/dist/system.js"></script>

    <!-- 2. Configure SystemJS -->
    <script src="systemjs.config.js"></script>
    <script>
      System.import('app').catch(function(err){ console.error(err); });
    </script>

    <!-- Example-specific styles -->
    <style>
      html, body { overflow: hidden; }
      body { font-family: "RobotoRegular",Helvetica,Arial,sans-serif; font-size: 14px; margin: 0; }
      my-app { display: block; width: 100%; overflow: hidden; min-height: 80px; box-sizing: border-box; padding: 30px; }
      my-app > .k-icon.k-i-loading { font-size: 64px; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); }
      .example-wrapper { min-height: 280px; align-content: flex-start; }
      .example-wrapper p, .example-col p { margin: 0 0 10px; }
      .example-wrapper p:first-child, .example-col p:first-child { margin-top: 0; }
      .example-col { display: inline-block; vertical-align: top; padding-right: 20px; padding-bottom: 20px; }
      .example-config { margin: 0 0 20px; padding: 20px; background-color: rgba(0,0,0,.03); border: 1px solid rgba(0,0,0,.08); }
      .event-log { margin: 0; padding: 0; max-height: 100px; overflow-y: auto; list-style-type: none; border: 1px solid rgba(0,0,0,.08); background-color: #fff; }
      .event-log li {margin: 0; padding: .3em; line-height: 1.2em; border-bottom: 1px solid rgba(0,0,0,.08); }
      .event-log li:last-child { margin-bottom: -1px;}
    </style>
  </head>

  <!-- 3. Display the application -->
  <body>
    <my-app>
        <span class="k-icon k-i-loading" style="color: #ff6358"></span>
    </my-app>
    
  </body>
</html>