# LarangPaginator (Angular 4^ & ^5...)

This is a Laravel Angular Paginator for tables. For other backend language to use this library. Please make sure your success response conforms with this response: 
 
Note: the "data" key holding the payload can either be 'resource' || 'resources' || 'content' || 'contents' || 'items' || 'list' || no key specified holding the payload in response
   
      
    data: {
             "total": 50,
             "per_page": 15,
             "current_page": 1,
             "last_page": 4,
             "next_page_url": "http://laravel.app?page=2",
             "prev_page_url": null,
             "path": "http://laravel.app",
             "from": 1,
             "to": 15,
             "data":[
                  {
                      // Result Object
                  },
                  {
                      // Result Object
                  }
              ]
          }
    
  ## Release Note
  Due to compatibility issues in Angular 4 & 5, we will maintain all:
  ````
  Angular 4 from 4.0.0 and above.
  Angular 5 from 5.0.0 and above.
  ````
   
 ## Sample Usage 
 
 You can download sample usage of this library for angular 4 & 5 from release note through this url
  
 `https://github.com/Procaseycash/use-larang-paginator`
 
 ## Dependencies
 
 `npm install font-awesome --save`
 
 Read up on how to setup font-awesome in your application.
 
 ## Installation
 
 `npm install --save larang-paginator`

   
## Usage in Application

Follow the instruction below to use LarangPaginator.

`import {LarangPaginatorModule} from 'larang-paginator';`

Add `LarangPaginatorModule.forRoot()` in AppModule or Other Modules using `LarangPaginatorModule`
     
   # Notice: 
  ```` 
  path: full path of the api url to call for data.
  from: the key the eventService will use in mapping when data has responded from paginator. (from key must be unique to every component using pagination)
  data: (paginated response), this must be the first data rendered from the component which information are picked to generate the pagination.
  limit: paginated data per page, default is 50.
  perNav: navigation bar to show at a time: defualt is 5.
  viewPage: string value to hold the Integer value for the next page. default is 'page'
  paginate: string value to hold the Integer value for limit in a view page. defualt is 'paginate'.
  
   
  Note that the query string in (next_page_url & prev_page_url) must be thesame to what is passed down in viewPage & paginate for paginator to work with.

  ````
  
  A sample larangPaginator built url for paginating will be `http://localhost:8088/api/organizations?page=1&paginate=5`
  
  
   ## *.component.ts
   
   Add/refactor the following code to the appropriate places in your component.ts

  
````
import {Component, OnInit} from '@angular/core';
import {HttpClient} from "@angular/common/http";
import {EventsService} from "larang-paginator";

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  title = 'app';
  public paginator = {
    path: 'http://localhost:8088/api/organizations',
    limit: 5,
    perNav: 5,
    data: null,
    from: 'list_organizations'

  };

  constructor(private eventsService: EventsService, private http: HttpClient) {
    this.eventsService.on(this.paginator.from, (res) => {
      // pass response to the property rendering the data in view

      this.paginator.data = res.data; // update paginated data in view
    });
  }
  private getOrganizations() {
    this.http.get(this.paginator.path + `?page=1&paginate=${this.paginator.limit}`).subscribe(
      (res) => {
        this.paginator.data = res['data'];
      },
      (err) => {

      }
    );
  }

  ngOnInit() {
    this.getOrganizations();
  }
}

      
  ````
  
  ## *.component.html
  Add this below the table you want it to paginate data from backend.
  
  ````
 <div  *ngIf="paginator.data"  class="col-sm-6 col-sm-auto">
   <table width="100%" class="table table-striped table-responsive">
     <tr>
       <td>#</td>
       <td>Name</td>
       <td>Email</td>
     </tr>
 
     <tr *ngFor="let page of paginator.data['data']; let i = index;">
       <td>{{((paginator.data['current_page'] - 1) * paginator.limit + i + 1) || (i + 1)}}</td>
       <td>{{page?.name}}</td>
       <td>{{page?.email}}</td>
     </tr>
 
   </table>
    
   <!-- You can add viewPage & paginate name. the default sample will be page=1&paginate=40
        you can inject [viewPage]="'perPage'", [paginate]="'limit'" and u get a sample of perPage=1&limit=40 
        
        -->
   
   <app-paginator [from]="paginator.from" [data]="paginator.data" [path]="paginator.path"
                  [limit]="paginator.limit" [perNav]="paginator.perNav"></app-paginator>
 
 </div>
````

## Backend expected request

Your backend will expect 

````
viewPage: integer to determine next page
paginate: integer to determine limit of data per view page.
````
 
## Build as a package

`npm run pack-build`


## Publish to npm

`npm publish dist`
