src/grid.component.ts
| changeDetection | ChangeDetectionStrategy.OnPush | 
            
| encapsulation | ViewEncapsulation.None | 
            
| selector | app-grid | 
            
| styles | 
    .grid-cell {
      padding: 8px;
      width: 1%;
  }
  .grid-header{
      cursor: pointer;
      text-align: left;
  }
  .box-heading {
    font-weight: bold;
    font-family: 'Oswald';
    margin-bottom: 15px;
  }
  * {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
  }
  *:before,
  *:after {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
  }
  html {
    font-size: 62.5%;
    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
    height: 100%;
  }
  body {
    font-family: 'Open Sans', sans-serif;
    font-size: 13px;
    line-height: 1.42857143;
    color: #999999;
    background-color: #f0f2f5;
    height: 100%;
  }
  .table tbody tr td {
    border-top: 1px solid #efefef;
  }
  textarea:focus,
  input[type="text"]:focus,
  input[type="password"]:focus,
  input[type="datetime"]:focus,
  input[type="datetime-local"]:focus,
  input[type="date"]:focus,
  input[type="month"]:focus,
  input[type="time"]:focus,
  input[type="week"]:focus,
  input[type="number"]:focus,
  input[type="email"]:focus,
  input[type="url"]:focus,
  input[type="search"]:focus,
  input[type="tel"]:focus,
  input[type="color"]:focus,
  .uneditable-input:focus {
    border-color: #999999;
    box-shadow: none;
    outline: 0 none;
  }
  a:focus,
  .btn:focus {
    outline: 0 !important;
  }
  .img-circle {
    border-radius: 50% !important;
  }
  h1,
  h2,
  h3,
  h4,
  h5,
  h6 {
    font-family: "Open Sans", sans-serif;
    font-weight: 300;
  }
  .panel {
    -webkit-box-shadow: none !important;
    box-shadow: none !important;
    -webkit-border-radius: 0 !important;
    -moz-border-radius: 0 !important;
    border-radius: 0 !important;
     border: 5px solid #e5e5e5;
      border-radius: 0 !important;
      box-shadow: none !important;
  }
  .panel > .panel-heading {
    font-size: 18px;
    padding: 7px 15px;
    border-top-right-radius: 0 !important;
    border-top-left-radius: 0 !important;
    border-color: #e5e5e5 !important;
  }
  .panel > .panel-footer {
    font-size: 18px;
    padding: 7px 15px;
    border-bottom-right-radius: 0 !important;
    border-bottom-left-radius: 0 !important;
  }
  .panel.panel-primary {
    border-color: #dc6767;
  }
  .panel.panel-primary > .panel-heading {
    color: #FFFFFF;
    background: #dc6767;
    border-color: #dc6767 !important;
  }
  .panel.panel-primary > .panel-footer {
    color: #FFFFFF;
    background: #dc6767;
    border-color: #dc6767 !important;
  }
  .panel.panel-red {
    border-color: #bf4346;
  }
  .panel.panel-red > .panel-heading {
    color: #FFFFFF;
    background: #bf4346;
    border-color: #bf4346 !important;
  }
  .panel.panel-red > .panel-footer {
    color: #FFFFFF;
    background: #bf4346;
    border-color: #bf4346 !important;
  }
  .panel.panel-orange {
    border-color: #e9662c;
  }
  .panel.panel-orange > .panel-heading {
    color: #FFFFFF;
    background: #e9662c;
    border-color: #e9662c !important;
  }
  .panel.panel-orange > .panel-footer {
    color: #FFFFFF;
    background: #e9662c;
    border-color: #e9662c !important;
  }
  .panel.panel-green {
    border-color: #488c6c;
  }
  .panel.panel-green > .panel-heading {
    color: #FFFFFF;
    background: #488c6c;
    border-color: #488c6c !important;
  }
  .panel.panel-green > .panel-footer {
    color: #FFFFFF;
    background: #488c6c;
    border-color: #488c6c !important;
  }
  .panel.panel-yellow {
    border-color: #f2994b;
  }
  .panel.panel-yellow > .panel-heading {
    color: #FFFFFF;
    background: #f2994b;
    border-color: #f2994b !important;
  }
  [class^="fa-"],
  [class^="glyphicon-"],
  [class^="icon-"],
  [class*=" fa-"],
  [class*=" glyphicon-"],
  [class*=" icon-"] {
    display: inline-block;
    margin-top: 1px;
    font-size: 14px;
    *margin-right: .3em;
    line-height: 14px;
    -webkit-font-smoothing: antialiased;
  }
  li [class^="fa-"],
  li [class^="glyphicon-"],
  li [class^="icon-"],
  li [class*=" fa-"],
  li [class*=" glyphicon-"],
  li [class*=" icon-"] {
    display: inline-block;
    width: 1.25em;
    text-align: center;
  }
  li [class^="glyphicon-"],
  li [class*=" glyphicon-"] {
    top: 2px;
  }
  li [class^="icon-"],
  li [class*=" icon-"] {
    top: 1px;
    position: relative;
  }
  li [class^="fa-"].icon-large,
  li [class^="glyphicon-"].icon-large,
  li [class^="icon-"].icon-large,
  li [class*=" fa-"].icon-large,
  li [class*=" glyphicon-"].icon-large,
  li [class*=" icon-"].icon-large {
    width: 1.5625em;
  }
  .table thead tr th,
  .table thead tr td {
    border-bottom: 0;
  }
  .table.table-sm {
    font-size: .875em;
  }
  .table.table-lg {
    font-size: 1.2em;
  }
  .table > input[type='text'] {
    font-weight: normal;
    height: 30px;
    padding: 5px 10px;
    font-size: 12px;
    line-height: 1.5;
  }
  .table select {
    font-weight: normal;
    height: 30px;
    padding: 5px 10px;
    font-size: 12px;
    line-height: 1.5;
  }
  .table.table-hover-color tbody tr:hover td:first-child {
    border-left: 4px solid #dc6767;
  }
  .table-actions {
    margin-bottom: 20px;
  }
  .table-actions.bottom {
    margin-bottom: 0;
    margin-top: 20px;
  }
  .table-actions .pagination {
    margin: 0;
  }
  .fixed-header {
    top: 0;
    position: fixed;
    width: auto;
    display: none;
    border: none;
    z-index: 999;
  }
  .page-header-breadcrumb {
    -webkit-border-radius: 0 !important;
    -moz-border-radius: 0 !important;
    border-radius: 0 !important;
  }
  .form-control {
    -webkit-box-shadow: none !important;
    box-shadow: none !important;
    border-color: #e5e5e5;
    -webkit-border-radius: 0 !important;
    -moz-border-radius: 0 !important;
    border-radius: 0 !important;
  }
  label {
    font-weight: normal;
  }
   | 
            
| template |  | 
            
                        Methods | 
                
                        Inputs | 
                
                        Outputs | 
                
                            constructor()
                         | 
                    
| 
                                     Defined in src/grid.component.ts:307 
                                 | 
                            
                            
                            columns
                         | 
                        
                               
                                Type:      | 
                    
| 
                                     Defined in src/grid.component.ts:303 
                                 | 
                            |
                            
                            pageSize
                         | 
                        
                               
                                Type:     
                              Default value:   | 
                    
| 
                                     Defined in src/grid.component.ts:307 
                                 | 
                            |
                            
                            rows
                         | 
                        
                               
                                Type:      | 
                    
| 
                                     Defined in src/grid.component.ts:304 
                                 | 
                            |
                            
                            title
                         | 
                        
                               
                                Type:      | 
                    
| 
                                     Defined in src/grid.component.ts:305 
                                 | 
                            |
                            
                            totalItems
                         | 
                        
                               
                                Type:     
                              Default value:   | 
                    
| 
                                     Defined in src/grid.component.ts:306 
                                 | 
                            |
                            
                            onItemDelete
                         | 
                        
                            $event type:    EventEmitter<IEntity>
                         | 
                    
| 
                                     Defined in src/grid.component.ts:299 
                                 | 
                            |
                            
                            onItemEdit
                         | 
                        
                            $event type:    EventEmitter<IEntity>
                         | 
                    
| 
                                     Defined in src/grid.component.ts:298 
                                 | 
                            |
                            
                            onPageChanged
                         | 
                        
                            $event type:    EventEmitter<number>
                         | 
                    
| 
                                     Defined in src/grid.component.ts:301 
                                 | 
                            |
                            
                            onSort
                         | 
                        
                            $event type:    EventEmitter<ISortResult>
                         | 
                    
| 
                                     Defined in src/grid.component.ts:300 
                                 | 
                            |
| deleteItem | ||||||||
    deleteItem(entity: IEntity)
                         | 
                    ||||||||
| 
                                     Defined in src/grid.component.ts:321 
                                 | 
                            ||||||||
| 
    
                                 
                                        Parameters :
                                         
                                
 
                                    Returns :      
                                    void
    
                                 | 
                    
| editItem | ||||||||
    editItem(entity: IEntity)
                         | 
                    ||||||||
| 
                                     Defined in src/grid.component.ts:317 
                                 | 
                            ||||||||
| 
    
                                 
                                        Parameters :
                                         
                                
 
                                    Returns :      
                                    void
    
                                 | 
                    
| pageChange | ||||||||
    pageChange(page: number)
                         | 
                    ||||||||
| 
                                     Defined in src/grid.component.ts:325 
                                 | 
                            ||||||||
| 
    
                                 
                                        Parameters :
                                         
                                
 
                                    Returns :      
                                    void
    
                                 | 
                    
| sort | ||||||||
    sort(sort: ISortResult)
                         | 
                    ||||||||
| 
                                     Defined in src/grid.component.ts:313 
                                 | 
                            ||||||||
| 
    
                                 
                                        Parameters :
                                         
                                
 
                                    Returns :      
                                    void
    
                                 | 
                    
import {
  Component,
  Input,
  OnInit,
  ChangeDetectionStrategy,
  EventEmitter,
  Output,
  ViewEncapsulation
} from '@angular/core';
import { IEntity } from './IEntity';
import { ISortResult } from './ISortResult';
import { IGridColumn } from './IGridColumn';
import { IGridRow } from './IGridRow';
@Component({
  selector: 'app-grid',
  template: `
      <div class="panel panel-green">
      <div class="panel-heading">{{title}}</div>
      <div class="panel-body">
          <table *ngIf="rows" class="table table-hover">
              <app-header [columns]="columns" (onSort)="sort($event)"></app-header>
              <app-row [items]="rows" (onItemEdit)="editItem($event)" (onItemDelete)="deleteItem($event)"></app-row>
          </table>
          <app-pagination [totalItems]="totalItems" [pageSize]="pageSize" (onPageChanged)="pageChange($event)"></app-pagination>
      </div>
    </div>
    `,
  styles: [
    `
    .grid-cell {
      padding: 8px;
      width: 1%;
  }
  .grid-header{
      cursor: pointer;
      text-align: left;
  }
  .box-heading {
    font-weight: bold;
    font-family: 'Oswald';
    margin-bottom: 15px;
  }
  * {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
  }
  *:before,
  *:after {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
  }
  html {
    font-size: 62.5%;
    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
    height: 100%;
  }
  body {
    font-family: 'Open Sans', sans-serif;
    font-size: 13px;
    line-height: 1.42857143;
    color: #999999;
    background-color: #f0f2f5;
    height: 100%;
  }
  .table tbody tr td {
    border-top: 1px solid #efefef;
  }
  textarea:focus,
  input[type="text"]:focus,
  input[type="password"]:focus,
  input[type="datetime"]:focus,
  input[type="datetime-local"]:focus,
  input[type="date"]:focus,
  input[type="month"]:focus,
  input[type="time"]:focus,
  input[type="week"]:focus,
  input[type="number"]:focus,
  input[type="email"]:focus,
  input[type="url"]:focus,
  input[type="search"]:focus,
  input[type="tel"]:focus,
  input[type="color"]:focus,
  .uneditable-input:focus {
    border-color: #999999;
    box-shadow: none;
    outline: 0 none;
  }
  a:focus,
  .btn:focus {
    outline: 0 !important;
  }
  .img-circle {
    border-radius: 50% !important;
  }
  h1,
  h2,
  h3,
  h4,
  h5,
  h6 {
    font-family: "Open Sans", sans-serif;
    font-weight: 300;
  }
  .panel {
    -webkit-box-shadow: none !important;
    box-shadow: none !important;
    -webkit-border-radius: 0 !important;
    -moz-border-radius: 0 !important;
    border-radius: 0 !important;
     border: 5px solid #e5e5e5;
      border-radius: 0 !important;
      box-shadow: none !important;
  }
  .panel > .panel-heading {
    font-size: 18px;
    padding: 7px 15px;
    border-top-right-radius: 0 !important;
    border-top-left-radius: 0 !important;
    border-color: #e5e5e5 !important;
  }
  .panel > .panel-footer {
    font-size: 18px;
    padding: 7px 15px;
    border-bottom-right-radius: 0 !important;
    border-bottom-left-radius: 0 !important;
  }
  .panel.panel-primary {
    border-color: #dc6767;
  }
  .panel.panel-primary > .panel-heading {
    color: #FFFFFF;
    background: #dc6767;
    border-color: #dc6767 !important;
  }
  .panel.panel-primary > .panel-footer {
    color: #FFFFFF;
    background: #dc6767;
    border-color: #dc6767 !important;
  }
  .panel.panel-red {
    border-color: #bf4346;
  }
  .panel.panel-red > .panel-heading {
    color: #FFFFFF;
    background: #bf4346;
    border-color: #bf4346 !important;
  }
  .panel.panel-red > .panel-footer {
    color: #FFFFFF;
    background: #bf4346;
    border-color: #bf4346 !important;
  }
  .panel.panel-orange {
    border-color: #e9662c;
  }
  .panel.panel-orange > .panel-heading {
    color: #FFFFFF;
    background: #e9662c;
    border-color: #e9662c !important;
  }
  .panel.panel-orange > .panel-footer {
    color: #FFFFFF;
    background: #e9662c;
    border-color: #e9662c !important;
  }
  .panel.panel-green {
    border-color: #488c6c;
  }
  .panel.panel-green > .panel-heading {
    color: #FFFFFF;
    background: #488c6c;
    border-color: #488c6c !important;
  }
  .panel.panel-green > .panel-footer {
    color: #FFFFFF;
    background: #488c6c;
    border-color: #488c6c !important;
  }
  .panel.panel-yellow {
    border-color: #f2994b;
  }
  .panel.panel-yellow > .panel-heading {
    color: #FFFFFF;
    background: #f2994b;
    border-color: #f2994b !important;
  }
  [class^="fa-"],
  [class^="glyphicon-"],
  [class^="icon-"],
  [class*=" fa-"],
  [class*=" glyphicon-"],
  [class*=" icon-"] {
    display: inline-block;
    margin-top: 1px;
    font-size: 14px;
    *margin-right: .3em;
    line-height: 14px;
    -webkit-font-smoothing: antialiased;
  }
  li [class^="fa-"],
  li [class^="glyphicon-"],
  li [class^="icon-"],
  li [class*=" fa-"],
  li [class*=" glyphicon-"],
  li [class*=" icon-"] {
    display: inline-block;
    width: 1.25em;
    text-align: center;
  }
  li [class^="glyphicon-"],
  li [class*=" glyphicon-"] {
    top: 2px;
  }
  li [class^="icon-"],
  li [class*=" icon-"] {
    top: 1px;
    position: relative;
  }
  li [class^="fa-"].icon-large,
  li [class^="glyphicon-"].icon-large,
  li [class^="icon-"].icon-large,
  li [class*=" fa-"].icon-large,
  li [class*=" glyphicon-"].icon-large,
  li [class*=" icon-"].icon-large {
    width: 1.5625em;
  }
  .table thead tr th,
  .table thead tr td {
    border-bottom: 0;
  }
  .table.table-sm {
    font-size: .875em;
  }
  .table.table-lg {
    font-size: 1.2em;
  }
  .table > input[type='text'] {
    font-weight: normal;
    height: 30px;
    padding: 5px 10px;
    font-size: 12px;
    line-height: 1.5;
  }
  .table select {
    font-weight: normal;
    height: 30px;
    padding: 5px 10px;
    font-size: 12px;
    line-height: 1.5;
  }
  .table.table-hover-color tbody tr:hover td:first-child {
    border-left: 4px solid #dc6767;
  }
  .table-actions {
    margin-bottom: 20px;
  }
  .table-actions.bottom {
    margin-bottom: 0;
    margin-top: 20px;
  }
  .table-actions .pagination {
    margin: 0;
  }
  .fixed-header {
    top: 0;
    position: fixed;
    width: auto;
    display: none;
    border: none;
    z-index: 999;
  }
  .page-header-breadcrumb {
    -webkit-border-radius: 0 !important;
    -moz-border-radius: 0 !important;
    border-radius: 0 !important;
  }
  .form-control {
    -webkit-box-shadow: none !important;
    box-shadow: none !important;
    border-color: #e5e5e5;
    -webkit-border-radius: 0 !important;
    -moz-border-radius: 0 !important;
    border-radius: 0 !important;
  }
  label {
    font-weight: normal;
  }
  `
  ],
  changeDetection: ChangeDetectionStrategy.OnPush,
  encapsulation: ViewEncapsulation.None
})
export class GridComponent implements OnInit {
  @Output() onItemEdit: EventEmitter<IEntity> = new EventEmitter();
  @Output() onItemDelete: EventEmitter<IEntity> = new EventEmitter();
  @Output() onSort: EventEmitter<ISortResult> = new EventEmitter();
  @Output() onPageChanged: EventEmitter<number> = new EventEmitter();
  @Input() columns: IGridColumn[] = [];
  @Input() rows: IGridRow[] = [];
  @Input() title: string;
  @Input() totalItems: number = 0;
  @Input() pageSize: number = 5;
  constructor() {}
  ngOnInit() {}
  sort(sort: ISortResult) {
    this.onSort.emit(sort);
  }
  editItem(entity: IEntity) {
    this.onItemEdit.emit(entity);
  }
  deleteItem(entity: IEntity) {
    this.onItemDelete.emit(entity);
  }
  pageChange(page: number) {
    this.onPageChanged.emit(page);
  }
}