Angular Client Side Pagination with Nodejs + MySQL

Angular-Client-Pagination-Nodejs-MySQL-Example

[no_toc]Tutorial: ” Angular Client Side Pagination with Nodejs + MySQL – Server Side Pagination in Node.js Angular MySQL database + Express + Sequelize CRUD ”

In the tutorial, I introduce how to build an “Angular 10 Nodejs Pagination RestAPIs Example with MySQL database (Server Side Pagination with filtering and sorting)” project using Express framework and Sequelize crud queries to interact with database’s records.

– Nodejs Express project (server side pagination) produces pagination RestAPIs with MySQL database records using Sequelize CRUD queries.
– Angular 10 project (client side pagination) will consume the Node.js pagination RestAPIs then show up on component’s views.

Related posts:


Architecture – Angular Client Side Pagination with Nodejs + MySQL

Angular Nodejs MySQL RestAPIs Overview
Angular Nodejs MySQL RestAPIs Overview

In the tutorial “Server Side Pagination in Node.js Angular 10”, We develop 2 projects:

  • Backend Project – Nodejs MySQL Pagination Application gets data from MySQL database then provides RestAPIs with pagination, filtering and sorting function for frontend
  • Frontend Project – Angular Application use HttpClient to fetch data from Backend Application then shows them in Bootstrap table with pagination, filtering and sorting functions

Project Goal – Angular Client Side Pagination with Nodejs + MySQL

– Make a request at API: /api/customers/pagefiltersort with pagination, filtering and sorting params as below:

  • page: 0 – first page
  • size: 5 – size of a page
  • salary: 4000 – filtering by salary field
  • agesorting: true – sorting by age
  • desc: true – descending or ascending sorting

– Result:

Nodejs MySQL Pagination RestAPIs Examples
Nodejs MySQL Pagination RestAPIs Examples

– Angular Frontend Pagination with Filtering and Sorting table:

Angular Pagination Frontend - Server Side Pagination in Node.js Angular 10
Angular Pagination Frontend

Video Guide – Angular Client Side Pagination with Nodejs + MySQL

For the tutorial “Angular Client Side Pagination with Nodejs + MySQL”, I create a Youtube video guide with clearly steps to debug full-stack for all running flows of living code from Angular client to Nodejs backend pagination:

Server Side Pagination in Node.js in MySQL

Related post:

Nodejs MySQL Pagination Filtering Sorting Tutorial – Stack: Express RestAPIs + Sequelize ORM + MySQL database Examples

Overall Server Side Pagination in Node.js/Express Sequelize MySQL Pagination

To handling Pagination RestAPI requests and do Paging Filtering and Sorting queries with MySQL database, we create a backend web Node.js application with 4 main points:

Nodejs Pagination Overall Architecture
Nodejs Pagination Overall Architecture
  • To handle pagination RestAPI requests with Node.js, We use Express framework.
  • To do pagination filtering and sorting queries with MySQL database, We use Sequelize ORM.
  • We define all RestAPI URLs in router.js.
  • We implement code how to process each paging filtering and sorting RestAPI request in controller.js file.

Nodejs/Express Sequelize Pagination Queries

To do the pagination with database, Sequelize ORM provides 2 model methods for supporting the purpose with limit and offset parameters:

  1. .findAll() – Search for multiple elements in the database
  2. .findAndCountAll() - Search for multiple elements in the database, returns both data and total count

How about limit & offset for nodejs pagination?

  • limit is the maximum number of records to fetch
  • offset is the quantity of records to skip

For example, if we have total 12 items:

  • { offset: 5 }: skip first 5 items, fetch 7 remaining items.
  • { limit: 5 }: fetch first 5 items.
  • { offset: 5, limit: 5 }: skip first 5 items, fetch 6th and 10th items.

Nodejs Sequelize findAll() method

Here is an query example with the Sequelize .findAll({offset, limit}) method:

Debug with .FindAll Method of Sequelize Model
Debug with .FindAll Method of Sequelize Model

The .findAll() method return an array of 7 items from id=8 to id=14 (the first 7 items are skips because the offset = page*limit = 7).

Test Sequelize findAll Method - return 7 items to Client Side
Test Sequelize findAll Method – return 7 items to Client Side

Using a Native SQL query to double check the above results:

Using Native SQL Query to Double Check the Returned Results of Squelize findAll Query
Using Native SQL Query to Double Check the Returned Results of Squelize findAll Query

– We do NOT know how many next items we can fetch more when doing the pagination with .findAll() method.

-> Let’s go with next session: how to work with Sequelize .findAndCountAll() method for finding the new solution!

Nodejs Sequelize findAndCountAll() method

Here is a query example with the Sequelize .findAndCountAll({offset, limit}) method:

Debug with Sequelize .findAndCountAll method
Debug with Sequelize .findAndCountAll method

In the tutorial “Angular Client Side Pagination with Nodejs + MySQL”, This is a convenience method that combines .findAll() and count, this is useful when dealing with queries related to pagination where you want to retrieve data with a limit and offset but also need to know the total number of records that match the query:

The success handler will always receive an object type with two properties:

  • count is the total number records matching the where clause and other filters due to associations
  • rows – an array of objects, the records matching the where clause and other filters due to associations, within the limit and offset range

So the Sequelize method .findAndCountAll({...}) is the best solution for building Node.js RestAPIs with pagination filtering and sorting functions.

How to buid Server side in Node.js Express Pagination Mysql

For building the Node.js Pagination project, we follow 5 steps for development:

  1. Setup Nodejs Project
  2. Create an Express WEB Application Server
  3. Define All RestAPI URLs in router.js
  4. Configure MySQL Database with Sequelize ORM
  5. Implement All RESTAPIs in controllers.js file

Create Nodejs Express Project

In the tutorial “Angular Client Side Pagination with Nodejs + MySQL”, before creating a Nodejs project, we need to confirm that the Nodejs and npm had been installed in your computer development by cmd: node -v and npm -v

Check Nodejs Environment for Development
Check Nodejs Environment for Development

If these commandlines are not recognized by command prompt, it means you need to install them by visit the https://nodejs.org/en/ site and download installed package and do the nodejs setup for development later.

Now starting development! Create a folder and named it as Nodejs-Pagination-Filtering-Sorting, go inside the folder, open a cmd and initiate a Nodejs project by cmd npm init. After all, a package.json file is created as below content:

{
  "name": "nodejs-pagination-filtering-sorting",
  "version": "1.0.0",
  "description": "Nodejs pagination filtering sorting",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/github.com/loizenai.git"
  },
  "keywords": [
    "nodejs",
    "filtering",
    "sorting",
    "pagination"
  ],
  "author": "https://loizenai.com",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/github.com/loizenai/issues"
  },
  "homepage": "https://github.com/github.com/loizenai#readme",
  "dependencies": {
    "body-parse": "^0.1.0",
    "cors": "^2.8.5",
    "express": "^4.17.1",
    "mysql2": "^2.1.0",
    "sequelize": "^6.3.3"
  }
}

For coding Editor, we use friendly Visual Studio Code to write code and debug Nodejs project. For the tutorial, We will create a project with below structure:

Nodejs Project Structure
Nodejs Project Structure
  1. file db.config.js is used to define MySQL database configuration with Sequelize ORM
  2. file customer.model.js is used to define a Sequelize model mapped with corresponding MySQL database table schema.
  3. file router.js is used to define all Express RestAPI URLs
  4. file controller.js is used to implement detail logic code to process each incoming request
  5. file server.js is used to implement a Nodejs Web server

To development a Nodejs RestAPIs with MySQL database, we need a set of packages to handle the full stack of the web backend proccessing, they includes Express framework, Cors, Body Parse, MySQL packages and Sequelize ORM.

We can install all the packages by one cmd:

$npm install --save express cors body-parser mysql2 sequelize

For more details about "Express framework, Cors, Body Parse, MySQL packages and Sequelize ORM", you can refer here.

Create Nodejs/Express Application Server

In the tutorial "Angular Client Side Pagination with Nodejs + MySQL", To implement an Express RestAPIs Application, firstly we need create a server with express app:

- server.js

const express = require('express');
const app = express();
...
const server = app.listen(8080, function () {
 
  let host = server.address().address
  let port = server.address().port
 
  console.log("App listening at http://%s:%s", host, port); 
})

For parsing body of requests, we need use body-parser dependency, add more code on server.js file:

...
var bodyParser = require('body-parser');
...
app.use(bodyParser.json());
...
const server = app.listen(8080, function () {
...

We define all RESTAPI URLs in a file router.js and then need attach it with the Express Application:

...
let router = require('./app/routers/router.js');
...
app.use('/', router);
...
const server = app.listen(8080, function () {
...

To enable CORS function, we need attach it with Express app:

const cors = require('cors')
const corsOptions = {
  origin: 'http://localhost:4200',
  optionsSuccessStatus: 200
}
app.use(cors(corsOptions));

Here is all coding in the server.js file:

const express = require('express');
const app = express();

var bodyParser = require('body-parser');
 
const db = require('./app/config/db.config.js');
  
// force: true will drop the table if it already exists
db.sequelize.sync({force: true}).then(() => {
  console.log('Drop and Resync with { force: true }');
}); 

let router = require('./app/routers/router.js');

const cors = require('cors')
const corsOptions = {
  origin: 'http://localhost:4200',
  optionsSuccessStatus: 200
}
app.use(cors(corsOptions));

app.use(bodyParser.json());
app.use('/', router);

// Create a Server
const server = app.listen(8080, function () {
 
  let host = server.address().address
  let port = server.address().port
 
  console.log("App listening at http://%s:%s", host, port); 
})

Nodejs/Express Define All RestAPI URLs in router.js

In the tutorial "Angular Client Side Pagination with Nodejs + MySQL", for making a router with Express framework, firstly we need get the router object from Express app. Then using it to define the GET/POST/DELETE/PUT requests:

let express = require('express');
let router = express.Router();
 
const customers = require('../controllers/controller.js');

router.get('/api/customers/pagination', customers.pagination);
router.get('/api/customers/filteringbyage', customers.filteringByAge);
router.get('/api/customers/pagefiltersort', customers.pagingfilteringsorting);

module.exports = router;

Use the express.Router class to create modular, mountable route handlers. A Router instance is a complete middleware and routing system.

Nodejs/Express Configure MySQL Database with Sequelize ORM

Firstly, we create a file env.js with an const Object to include all configured parameters for MySQL database setup.

const env = {
  database: 'loizenaidb',
  username: 'root',
  password: '12345',
  host: 'localhost',
  dialect: 'mysql',
  pool: {
    max: 5,
    min: 0,
    acquire: 30000,
    idle: 10000
  }
};

module.exports = env;

Now for the main setting between MySQL database and Sequelize ORM, we define a file db.config.js as below code:

const env = require('./env.js');
 
const Sequelize = require('sequelize');
const sequelize = new Sequelize(env.database, env.username, env.password, {
  host: env.host,
  dialect: env.dialect,
  operatorsAliases: false,
 
  pool: {
    max: env.max,
    min: env.pool.min,
    acquire: env.pool.acquire,
    idle: env.pool.idle
  }
});

const db = {};

db.Sequelize = Sequelize;
db.sequelize = sequelize;
 
db.Customer = require('../models/customer.model.js')(sequelize, Sequelize);
 
module.exports = db;

Nodejs/Express Implement All RESTAPIs in controllers.js file

Nodejs Pagination RestAPIs - Controller.js File
Nodejs Pagination RestAPIs - Controller.js File

For handling Nodejs RestAPIs' processing that been defined in router.js file, we implement all 3 working functions in controller.js file:

  1. create = (req, res) function is used to handle a GET request at the endpoint /api/customers/create to post a new Customer entity to MySQL database
  2. exports.getSalaries = (req, res) function is used to handle a GET request at the endpoint /api/customers/getSalaries and returns a list of distinct salaries from database
  3. pagingfilteringsorting = (req, res) function is used to handle a GET request at the endpoint /api/customers/pagefiltersort to do an association quering operation: pagination, plus filtering by salary and sorting by age

Server Side Nodejs/Express Sequelize Pagination RestAPIs

pagingfilteringsorting = (req, res) function is used to handle a GET request at the endpoint /api/customers/pagefiltersort to do an association quering operation: pagination, plus filtering by salary and sorting by age from database.

We use the method .findAndCountAll(...) to do the associated operation: pagination plus filtering and sorting query. So we add more 2 clauses inside .findAndCountAll(...) method:

  • Where clause - using to filter by salary field: where: {salary: salary}
  • Order clause - using to sort rows by 2 fileds age with descending direction or not:
    
    order: [
      ['age', 'DESC']
    ],
    

Straightforward steps to implement the Pagination + Filtering and Sorting function:

  • Retrieve 5 parameters from incoming request query: limit, page for pagination and salary for filtering and agesorting & desc for sorting
  • Calulate an offset for Sequelize pagining query later:
    const offset = page ? page * limit : 0;
  • Do the Sequelize pagination filtering and sorting with .findAndCountAll() method:
    Customer.findAndCountAll({
                                attributes: ['id', 'firstname', 'lastname', 'age', 'address', 'salary', 'copyrightby'],
                                where: {salary: salary}, 
                                order: [
                                  ['age', 'DESC']
                                ],
                                limit: limit, 
                                offset:offset 
                              })
  • Construct a Json message with informative fields and return back to client side:
    const response = {
      "copyrightby": "https://loizenai.com",
      "totalPages": totalPages,
      "pageNumber": page,
      "pageSize": result.rows.length,
      "customers": result.rows
    };
    res.send(response);
  • Do NOT forget to handle an un-expected errors with try-catch statement.
    try{
        //...
    }catch(error) {
        res.status(500).send({
          message: "Error -> Can NOT complete a paging request!",
          error: error.message,
        });
    }   

- Coding here:

exports.pagingfilteringsorting = async (req, res) => {
  try{
    let page = parseInt(req.query.page);
    let limit = parseInt(req.query.size);
    let agesorting = (req.query.agesorting === 'true');
    let desc = (req.query.desc === 'true');
    let salary = req.query.salary ? parseInt(req.query.salary) : -1;
  
    const offset = page ? page * limit : 0;

    console.log("offset = " + offset);    

    let result = {};

    // NOT Filtering with salary
    if(salary < 0 ){
      // not sorting with age
      if(agesorting == false) {
        result = await Customer.findAndCountAll({
          attributes: ['id', 'firstname', 'lastname', 'age', 'address', 'salary', 'copyrightby'],
          limit: limit, 
          offset:offset 
        });
      } else {
        if(desc == false) { // sorting with age and ascending
          result = await Customer.findAndCountAll({
            attributes: ['id', 'firstname', 'lastname', 'age', 'address', 'salary', 'copyrightby'],
            limit: limit, 
            offset:offset,
            order: [
              ['age', 'ASC']
            ]             
          });
        } else { // sorting with age and descending
          result = await Customer.findAndCountAll({
            attributes: ['id', 'firstname', 'lastname', 'age', 'address', 'salary', 'copyrightby'],
            limit: limit, 
            offset:offset,
            order: [
              ['age', 'DESC']
            ]             
          });
        }
      }
    } else { // Filtering with salary
      // not sorting with age
      if(agesorting == false) {
        result = await Customer.findAndCountAll({
          attributes: ['id', 'firstname', 'lastname', 'age', 'address', 'salary', 'copyrightby'],
          where: {salary: salary},
          limit: limit, 
          offset:offset
        });
      } else {
        if(desc == false) { // sorting with age and ascending
          result = await Customer.findAndCountAll({
            attributes: ['id', 'firstname', 'lastname', 'age', 'address', 'salary', 'copyrightby'],
            where: {salary: salary},
            limit: limit, 
            offset:offset,
            order: [
              ['age', 'ASC']
            ]                         
          });
        } else { // sorting with age and descending
          result = await Customer.findAndCountAll({
            attributes: ['id', 'firstname', 'lastname', 'age', 'address', 'salary', 'copyrightby'],
            where: {salary: salary},
            limit: limit, 
            offset:offset,
            order: [
              ['age', 'DESC']
            ]                         
          });
        }
      }      
    }

    const totalPages = Math.ceil(result.count / limit);
    const response = {
      "copyrightby": "https://loizenai.com",
      "totalPages": totalPages,
      "pageNumber": page,
      "pageSize": result.rows.length,
      "customers": result.rows
    };
    res.send(response);
  }catch(error) {
    res.status(500).send({
      message: "Error -> Can NOT complete a paging request!",
      error: error.message,
    });
  }      
}

- Result:

Nodejs MySQL Pagination RestAPIs Examples
Nodejs MySQL Pagination RestAPIs Examples

Nodejs/Express GET all Distinct Salary RestAPIs

getSalaries = (req, res) function is used to handle a GET request at the endpoint /api/customers/getSalaries and returns a list of distinct salaries from database:

exports.getSalaries = (req, res) => {
  Customer.findAll({
    attributes: [
      [Sequelize.fn('DISTINCT', Sequelize.col('salary')), 'salary'],
    ],
    order: [
      ['salary', 'ASC']
    ],                         
  }).then(result => {
    let salaries = result.map(x => x.salary);
    res.send(salaries);
  }).catch(error => {
    res.status(500).send({
      message: "Error -> Can NOT get all customer's salaries",
      error: error.message
    });
  });
}

- Result:

Get a List Of Distinct Salaries
Get a List Of Distinct Salaries

Angular Client Side Pagination Table Development with Nodejs/Express + MySQL

Related post:

Angular Nodejs Fullstack CRUD Application with MySQL/PostgreSQL – Angular 10-9-8 HttpClient + Nodejs Express, Sequelize ORM

Angular Client Side Pagination Overview

Angular Pagination Application Architecture Design
Angular Pagination Application Architecture Design

Angular Client Side Pagination - Create Project

We create an Angular Pagination Application with 2 main blocks:

  1. CustomerService is used to fetch data through Angular HTTP Client
  2. TableComponent is used to display data with pagination, filtering and sorting view
Angular Pagination Frontend
Angular Pagination Frontend

Here is the Angular project structure:

Angular Table Pagination with Nodejs RestAPIs - Project Structure
Angular Table Pagination with Nodejs RestAPIs - Project Structure

– We implement a component: angulartable with 2 files angulartable.component.html and angular.component.ts to display data on web.
– We implement a service customer.service.ts using Httpclient to interact with SpringBoot restPAPI to fetch data with pagination, filtering and sorting.
– We define 2 helpful class customer.ts and message.ts for mapping data with RestAPIs.

Angular Client Define Customer.ts class

export class Customer {
    id: number;
    firstname: string;
    lastname: string;
    age: number;
    salary: number;
    address: string;
    copyrightBy: string;
}

Angular Define Message.ts class

import { Customer } from './customer';

export class Message {
    customers: Customer[];
    totalPages: number;
    pageNumber: number;
    pageSize: number;
}

Implement Angular Customer Service

We implement CustomerService service which uses a built-in HttpClient of Angular to create 2 http methods:

  • getPagableCustomers() is used to a Page of Customer from SpringBoot RestAPI with 5 params for pagination, filtering and sorting data
  • getListSalaries() is used to get a list distinct salaries of Customer

Coding:

import { Injectable } from '@angular/core';
import { HttpClient, HttpErrorResponse, HttpParams } from '@angular/common/http';

import { Observable, throwError  } from 'rxjs';
import { catchError, retry } from 'rxjs/operators';

import { Message } from './message';

@Injectable({
  providedIn: 'root'
})
export class CustomerService {

  private baseUrl = 'http://localhost:8080/api/customers';

  constructor(private http: HttpClient) { }


  /**
   * Retrieve all customer from Backend
   */
  getPagableCustomers(pageNumber: number, 
                        pageSize: number, salary: number,
                        agesorting: boolean, desc: boolean): Observable<Message> {
    // Initialize Params Object
    let params = new HttpParams();

    // Begin assigning parameters
    params = params.append('page', pageNumber.toString());
    params = params.append('size', pageSize.toString());
    params = params.append('salary', salary.toString());
    params = params.append('agesorting', agesorting.toString());
    params = params.append('desc', desc.toString());

    return this.http.get<Message>(`${this.baseUrl}` + `/custom/pageable`, { params: params })
                  .pipe(
                    retry(3),
                    catchError(this.handleError)
                  );
  }

  getListSalaries(): Observable<Array<number>>{
    return this.http.get<Array<number>>(`${this.baseUrl}` + `/salaries`)
                  .pipe(
                    retry(3),
                    catchError(this.handleError)
                  );
  }

  private handleError(error: HttpErrorResponse) {
    if (error.error instanceof ErrorEvent) {
      // A client-side or network error occurred. Handle it accordingly.
      console.error('An error occurred:', error.error.message);
    } else {
      // The backend returned an unsuccessful response code.
      // The response body may contain clues as to what went wrong,
      console.error(
        `Backend returned code ${error.status}, ` +
        `body was: ${error.error}`);
    }
    // return an observable with a user-facing error message
    return throwError(
      'Something bad happened; please try again later.');
  };
}

Implement Angular Pagination Client Table Component

1. Implement View Page:

We use Bootstrap to implement the view page, so we need add it to the head tag of index.html page.
- Coding of index.html


<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>AngularHttpclient</title>
  <base href="/">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
  <!-- Latest compiled and minified CSS -->
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">
  <!-- jQuery library -->
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <!-- Popper JS -->
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
  <!-- Latest compiled JavaScript -->
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"></script>
</head>
<body>
  <div class="container" > 
    <div class="col-sm-7" style="background-color: #e6f9ff; margin:10px;padding:10px; border-radius: 5px">
      <div class="alert alert-danger">
          <h3>Angular + SpringBoot Tutorial</h3>
          <h6><strong>Pagination + Filtering and Sorting </strong></h6>
          <hr>
          <p>@Copyright by <strong><span style="color:blue"><a href="https://loizenai.com">https://loizenai.com</a></span></strong><br>
              youtube: <strong><a href="https://www.youtube.com/channel/UChkCKglndLes1hkKBDmwPWA"><span style="color:crimson">loizenai</span></a></strong>
          </p>
      </div>
      <app-root></app-root>
    </div> 
  </div>
</body>
</html>

In the tutorial "Angular Nodejs Pagination RestAPIs Example", we develop table component to do the task with 3 main parts for Angular view page to display data with pagination, filtering and sorting:

  • a Bootstrap table with a pagination bar to display data and selecting a specific pagination
  • a Select List for distinct salaries to choose a specific salary for doing the pagination with salary filtering
  • a checkbox group with 2 fields age and desc to make a decission to sort or NOT with the age field by descending or ascending direction

- Code of angulartable.component.html view page:

<div *ngIf="customers.length">
    <h3>Processing...</h3>
    <br>
    <div>    
      <h5>Do you want sorting by?</h5>
      <form>
        <label class="checkbox-inline">
          <input type="checkbox"
                  [checked]="agesorting"
                  (change)="onAgeSortingChange($event)"> Age
          <br>
          <input  [disabled]="!agesorting" type="checkbox"
                  [checked]="desc"
                  (change)="desc = !desc"> Desc
        </label>
      </form>
      <button type="button" class="btn btn-primary" (click)="sortNow()">Sort Now</button>
    </div>
    <hr>
    <div class="form-group">
      <label for="sel1"><h5>Filtering by Salary:</h5></label>
      <select class="form-control" id="salary_filtering"
                    (change)="getCustomerPagesWithSalaryFiltering($event.target.value)">
        <option>All</option>
        <option *ngFor="let salary of salaries">{{salary}}</option>
      </select>
    </div>
    <h3>Customers</h3>
    <table class="table table-hover table-sm">
        <thead class="thead-dark">
          <tr>
            <th>Id</th>
            <th>Firstname</th>
            <th>Lastname</th>
            <th>Age</th>
            <th>Salary</th>
            <th>Address</th>
            <th>Copyright By</th>
            <th></th>
          </tr>
        </thead>
        <tbody>
            <tr *ngFor="let customer of customers">
              <td>{{customer.id}}</td>
              <td>{{customer.firstname}}</td>
              <td>{{customer.lastname}}</td>
              <td>{{customer.age}}</td>
              <td>{{customer.salary}}</td>
              <td>{{customer.address}}</td>
              <td><a href="https://loizenai.com">{{customer.copyrightBy}}</a></td>
            </tr>
        </tbody>
    </table>
</div>

<ul class="pagination justify-content-center">
  <li class="page-item"><a (click)="previousClick()" class="page-link">Previous</a></li>
  <li *ngFor='let index of pageIndexes' class="page-item" [ngClass]="active(index)">
          <a (click)="getPaginationWithIndex(index)" class="page-link">
            {{index + 1}}
          </a>
  </li>
  <li class="page-item"><a (click)="nextClick()" class="page-link">Next</a></li>
</ul>

Angular Client Implement Pagination Table Component

We develop Table Component angulartable.component.ts arround below list of variables:

  currentSelectedPage:number = 0;
  totalPages: number = 0;
  customers: Array<Customer> = [];
  pageIndexes: Array<number> = [];

  // salaries list
  salaries: Array<number> = [];
  selectedSalary: number = -1;

  // sorting
  agesorting: boolean = false;
  desc: boolean = false;

What does it mean?

  • currentSelectedPage defines the current selected page for getting data
  • totalPages is the number page of data for pagination
  • customers contains a list customers of current fetching page
  • pageIndexes contains an array numbers that presents the number of pages to show for user selecting
  • salaries contains a list of salaries with distinct values
  • selectedSalary is a selected salary for filtering with pagination
  • ageSorting is a boolean variable that determines whether the sorting with age field or not
  • desc is a boolean variable that is used to determines a direction for sorting by descending or ascending (the default value)

We use the CustomerService to fetch data from SpringBoot RestAPIs, so we need to inject it in the constructor:


  constructor(private customerService: CustomerService) { 
  }

Angular show the fetching data with Pagination Table

For getting data from SpringBoot RestAPI, we define a function getPage() as below:

  getPage(page: number, selectedSalary: number, agesorting: boolean, desc: boolean){

    this.customerService.getPagableCustomers(page, pageSize, selectedSalary, 
                                              agesorting, desc)
            .subscribe(
                (message: Message) => {
                  console.log(message);
                  this.customers = message.customers;
                  this.totalPages = message.totalPages;
                  this.pageIndexes = Array(this.totalPages).fill(0).map((x,i)=>i);
                  this.currentSelectedPage = message.pageNumber;
                },
                (error) => {
                  console.log(error);
                }
            );
  }

At the initial time of Angular loading page, we need invoke the getPage function with appropriate parameters as below code:

  ngOnInit(): void {
    // get the first Page
    this.getPage(0, -1, false, false);
    // get Salaries
    this.getSalaries();
  }

On the view page, for showing the fetching data, we need binding them as below html code using the Angular directive:

<tbody>
    <tr *ngFor="let customer of customers">
      <td>{{customer.id}}</td>
      <td>{{customer.firstname}}</td>
      <td>{{customer.lastname}}</td>
      <td>{{customer.age}}</td>
      <td>{{customer.salary}}</td>
      <td>{{customer.address}}</td>
      <td><a href="https://loizenai.com">{{customer.copyrightBy}}</a></td>
    </tr>
</tbody>

Here is the how we build the pagination bar on Html view by binding the fetching data pageIndexes with html element by using a Angular built-in directive *ngFor:

<ul class="pagination justify-content-center">
  <li class="page-item"><a (click)="previousClick()" class="page-link">Previous</a></li>
  <li *ngFor='let index of pageIndexes' class="page-item" [ngClass]="active(index)">
          <a (click)="getPaginationWithIndex(index)" class="page-link">
            {{index + 1}}
          </a>
  </li>
  <li class="page-item"><a (click)="nextClick()" class="page-link">Next</a></li>
</ul>

For processing the navigation with Next and Previous buttons on Pagination bar, we define 2 funtions nextClick() and previousClick() as below:


 nextClick(){
    if(this.currentSelectedPage < this.totalPages-1){
      this.getPage(++this.currentSelectedPage,
                   this.selectedSalary, this.agesorting, this.desc);
    }  
  }

  previousClick(){
    if(this.currentSelectedPage > 0){
      this.getPage(--this.currentSelectedPage,
                   this.selectedSalary, this.agesorting, this.desc);
    }  
  }
}

Angular Client Side Pagination Do the Pagination and Filtering with salary selected option

Review again the implementation in html view page for the filtering select-option form funtion:

<div class="form-group">
  <label for="sel1"><h5>Filtering by Salary:</h5></label>
  <select class="form-control" id="salary_filtering"
                (change)="getCustomerPagesWithSalaryFiltering($event.target.value)">
    <option>All</option>
    <option *ngFor="let salary of salaries">{{salary}}</option>
  </select>
</div>

We use the Angular built-in directive *ngFor to build the selected-option list of distinct value of salaries.

The salaries list is fetched at the initial time of Angular Component:

  ngOnInit(): void {
    ...
    // get Salaries
    this.getSalaries();
  }

  getSalaries() {
    this.customerService.getListSalaries()
          .subscribe(
            (salaries: Array<number>) => {
              console.log(salaries);
              this.salaries = salaries;
            },
            (error) => {
              console.log(error);
            }
          );
  }

If having any change from selected form, the function (change)="getCustomerPagesWithSalaryFiltering($event.target.value) will be invoked:

getCustomerPagesWithSalaryFiltering(optionValue: any) {
  // convert option string value to appropriate number
  if(optionValue != "All"){
    this.selectedSalary = parseInt(optionValue);
  } else {
    this.selectedSalary = -1;
  }

  // load customer again with filtering and pagination api
  this.getPage(0, this.selectedSalary, this.agesorting, this.desc);
}

Angular Client Sorting Implementation with Age and Desc checkbox

Review again the html sorting div:

<div>    
  <h5>Do you want sorting by?</h5>
  <form>
    <label class="checkbox-inline">
      <input type="checkbox"
              [checked]="agesorting"
              (change)="onAgeSortingChange($event)"> Age
      <br>
      <input  [disabled]="!agesorting" type="checkbox"
              [checked]="desc"
              (change)="desc = !desc"> Desc
    </label>
  </form>
  <button type="button" class="btn btn-primary" (click)="sortNow()">Sort Now</button>
</div>

If having any changes on the checkboxes, they will immediately affect to the 2 variables agesorting and desc.


//.html file
(change)="onAgeSortingChange($event)"
(change)="desc = !desc"

//.ts file
onAgeSortingChange(value: any){
    this.agesorting = !this.agesorting;
    if(!this.agesorting){
      // reset desc
      this.desc = false;
    }
  }

When pressing the button Sort Now, the function sortNow() will be invoked for re-fetching the pagination and sorting data from SpringBoot RestAPI:

sortNow(){
  if(this.desc == true && this.agesorting == false){
    alert("Please select 'agesorting' option before selecting 'desc' option!");
    return;
  }
  // load again from backend for sorting with age field
  this.getPage(0, this.selectedSalary, this.agesorting, this.desc);
}

Detail Implementation angular.component.ts

import { Component, OnInit, ɵclearResolutionOfComponentResourcesQueue } from '@angular/core';
import { CustomerService } from '../customer.service';
import { Message } from '../message';
import { Customer } from '../customer';

const pageSize:number = 5;

@Component({
  selector: 'app-angulartable',
  templateUrl: './angulartable.component.html'
})
export class AngulartableComponent implements OnInit {
  currentSelectedPage:number = 0;
  totalPages: number = 0;
  customers: Array<Customer> = [];
  pageIndexes: Array<number> = [];

  // salaries list
  salaries: Array<number> = [];
  selectedSalary: number = -1;

  // sorting
  agesorting: boolean = false;
  desc: boolean = false;

  constructor(private customerService: CustomerService) { 
  }

  ngOnInit(): void {
    // get the first Page
    this.getPage(0, -1, false, false);
    // get Salaries
    this.getSalaries();
  }

  getPage(page: number, selectedSalary: number, agesorting: boolean, desc: boolean){

    this.customerService.getPagableCustomers(page, pageSize, selectedSalary, 
                                              agesorting, desc)
            .subscribe(
                (message: Message) => {
                  console.log(message);
                  this.customers = message.customers;
                  this.totalPages = message.totalPages;
                  this.pageIndexes = Array(this.totalPages).fill(0).map((x,i)=>i);
                  this.currentSelectedPage = message.pageNumber;
                },
                (error) => {
                  console.log(error);
                }
            );
  }

  getPaginationWithIndex(index: number) {
    this.getPage(index, this.selectedSalary, this.agesorting, this.desc);
  }

  getSalaries() {
    this.customerService.getListSalaries()
          .subscribe(
            (salaries: Array<number>) => {
              console.log(salaries);
              this.salaries = salaries;
            },
            (error) => {
              console.log(error);
            }
          );
  }

  getCustomerPagesWithSalaryFiltering(optionValue: any) {
    // convert option string value to appropriate number
    if(optionValue != "All"){
      this.selectedSalary = parseInt(optionValue);
    } else {
      this.selectedSalary = -1;
    }

    // load customer again with filtering and pagination api
    this.getPage(0, this.selectedSalary, this.agesorting, this.desc);
  }

  sortNow(){
    if(this.desc == true && this.agesorting == false){
      alert("Please select 'agesorting' option before selecting 'desc' option!");
      return;
    }
    // load again from backend for sorting with age field
    this.getPage(0, this.selectedSalary, this.agesorting, this.desc);
  }

  onAgeSortingChange(value: any){
    this.agesorting = !this.agesorting;
    if(!this.agesorting){
      // reset desc
      this.desc = false;
    }
  }

  active(index: number) {
    if(this.currentSelectedPage == index ){
      return {
        active: true
      };
    }
  }

  nextClick(){
    if(this.currentSelectedPage < this.totalPages-1){
      this.getPage(++this.currentSelectedPage,
                   this.selectedSalary, this.agesorting, this.desc);
    }  
  }

  previousClick(){
    if(this.currentSelectedPage > 0){
      this.getPage(--this.currentSelectedPage,
                   this.selectedSalary, this.agesorting, this.desc);
    }  
  }
}

Integration Testing – Angular Client Side Pagination

Below is a suite of testcases for the tutorial: "Angular 10 Nodejs Pagination RestAPIs Example (Server Side Pagination)".

1. Testcase 1 – Angular Client Side Pagination with Nodejs MySQL:

– Start time:

Angular Client - Start Time
Angular Client - Start Time

- Select Page 3:

Testcase 1 - Angular Nodejs Pagination - Select Page 3
Testcase 1 - Angular Nodejs Pagination - Select Page 3

2. Testcase 2 – Angular Pagination and Filtering View:

– Pagination and Filtering with salary is $4000:

Testcase 2 – Integrated Angular Nodejs Pagination - Pagination and Filtering with salary = $4000
Testcase 2 – Integrated Angular Nodejs Pagination - Pagination and Filtering with salary = $4000

– Pagination and Filtering with Salary = $3500:

Testcase 2 – Integrated Angular Nodejs RestAPI – Pagination and Filtering with salary = $3500
Testcase 2 – Integrated Angular Nodejs RestAPI – Pagination and Filtering with salary = $3500

3. Testcase 3 – Angular Pagination Filtering and Sorting View:

– Pagination and Filtering with salary is $3000 and Sorting by Age:

Testcase 3 – Integrated Angular Nodejs Pagination RestAPI – Pagination and Filtering with salary = $3000 and Age sorting
Testcase 3 – Integrated Angular Node.js RestAPI – Pagination and Filtering with salary = $3000 and Age sorting

– Pagination and Filtering with salary = $3500 and sorting by Age with Desc direction:

Testcase 3 – Integrated Angular Nodejs Pagination RestAPI – Pagination and Filtering with salary = $3500 and Age sorting with Desc direction
Testcase 3 – Integrated Angular Nodejs Pagination RestAPI – Pagination and Filtering with salary = $3500 and Age sorting with Desc direction

Further Reading

Should Reading:

Sourcecode - Angular Client Side Pagination

Below are all sourcecodes for the tutorial "Angular 10 Nodejs Pagination RestAPIs Example (Server Side Pagination in Node.js Angular 10)":

- How to buid Node.js Express Mysql Pagination?

Nodejs-Pagination-Filtering-Sorting

GitHub Sourcecode:

Nodejs-Pagination-Filtering-Sorting - GitHub

- How to build Angular Table Pagination?

- Sourcecode:

AngularTablePagination

- Github sourcecode - Server Side Pagination in Node.js Angular 10:

Angular-Nodejs-MySQL-Pagination - Client Development

361 thoughts on “Angular Client Side Pagination with Nodejs + MySQL”

  1. Hmm is anyone else experiencing problems with the images on this blog loading? I’m trying to figure out if its a problem on my end or if it’s the blog. Any feedback would be greatly appreciated.

  2. Hey! I could have sworn I’ve been to this blog before but after browsing through some of the post I realized it’s new to me. Anyhow, I’m definitely delighted I found it and I’ll be bookmarking and checking back often!

  3. I have been browsing online more than 3 hours today, yet I never found any interesting article like yours. It is pretty worth enough for me. Personally, if all site owners and bloggers made good content as you did, the internet will be a lot more useful than ever before.

  4. There are definitely loads of particulars like that to take into consideration. That could be a nice point to convey up. I supply the ideas above as normal inspiration however clearly there are questions like the one you bring up where an important thing might be working in trustworthy good faith. I don?t know if best practices have emerged around issues like that, but I’m positive that your job is clearly identified as a good game. Each girls and boys feel the impact of only a moment抯 pleasure, for the remainder of their lives.

  5. At the beginning of the big show, models walked in the magnificent Louvre and shuttled between ancient sculptures. Outside the window, you could also see the inverted pyramid of the Louvre’s iconic building. The dazzling array of artworks in the gallery pavilion made people dizzying. There is no need to travel far because of the appearance of travel.

  6. I keep listening to what is this great update lecture about receiving boundless online grant applications and so i are already shopping for the most beneficial site to obtain one. Could you advise me please, where could i receive some?

  7. I am curious to find out what blog platform you’re using? I’m experiencing some small security problems with my latest website and I would like to find something more risk-free. Do you have any suggestions?

  8. Thanks for your article. I would like to comment that the very first thing you will need to do is check if you really need repairing credit. To do that you simply must get your hands on a copy of your credit rating. That should never be difficult, considering that the government necessitates that you are allowed to get one cost-free copy of your real credit report yearly. You just have to check with the right people. You can either look at website for that Federal Trade Commission and also contact one of the major credit agencies directly.

  9. My brother recommended I would possibly like this web site. He was once entirely right. This submit truly made my day. You can not consider just how a lot time I had spent for this info! Thank you!

  10. This is the correct weblog for anybody who needs to find out about this topic. You understand so much its almost hard to argue with you (not that I really would want…HaHa). You definitely put a brand new spin on a topic thats been written about for years. Great stuff, simply nice!

  11. 904654 325597Incredibly greatest man toasts, nicely toasts. is directed building your personal by way with the wedding celebration as a result are supposed to try to be witty, amusing and consequently unusual as nicely as. best mans speech 84203

  12. Hello, I think your site might be having browser compatibility issues.
    When I look at your blog in Ie, it looks fine but when opening in Internet Explorer, it has some overlapping.
    I just wanted to give you a quick heads up! Other then that,
    very good blog!

  13. Please let me know if you’re looking for a article author for your site.
    You have some really good posts and I believe I would be a
    good asset. If you ever want to take some of the load off, I’d love
    to write some content for your blog in exchange for a
    link back to mine. Please blast me an email if interested.

    Kudos!

  14. Undeniably believe that which you said. Your favorite justification seemed to be on the net the simplest thing to be aware of.
    I say to you, I certainly get annoyed while people consider worries that they just don’t know about.
    You managed to hit the nail upon the top and defined out the whole thing without having
    side effect , people could take a signal. Will likely be back to get more.
    Thanks

  15. It is perfect time to make some plans for the longer
    term and it is time to be happy. I’ve learn this post and if I could I want to counsel you some interesting things
    or tips. Maybe you could write subsequent articles referring to this article.

    I want to read even more issues about it!

  16. You’re so interesting! I don’t suppose I’ve read something like this before.
    So nice to discover another person with some original thoughts on this subject.
    Really.. many thanks for starting this up. This site is one
    thing that’s needed on the internet, someone with a little
    originality!

  17. Appreciating the time and energy you put into your website
    and detailed information you offer. It’s nice to come across a
    blog every once in a while that isn’t the same outdated rehashed material.

    Fantastic read! I’ve bookmarked your site and I’m adding your RSS
    feeds to my Google account.

  18. Hmm is anyone else having problems with the pictures on this blog
    loading? I’m trying to determine if its a problem on my end or if it’s the blog.
    Any feed-back would be greatly appreciated.

  19. Hello, i believe that i noticed you visited my weblog so i came to go back the choose?.I am attempting to in finding issues to improve
    my site!I guess its good enough to use some of your ideas!!

  20. I’m curious to find out what blog system you’re utilizing?
    I’m experiencing some minor security issues with my latest blog and I would like to find something more safe.

    Do you have any suggestions?

  21. I have been browsing online more than 3 hours today, yet I never found any interesting article
    like yours. It is pretty worth enough for me. Personally, if all website owners and
    bloggers made good content as you did, the internet
    will be much more useful than ever before.

  22. you are truly a excellent webmaster. The website loading pace is incredible.
    It kind of feels that you’re doing any distinctive trick.
    In addition, The contents are masterpiece. you have performed a
    great activity on this topic!

  23. I think that what you published was actually very reasonable.
    However, think on this, what if you were to create a awesome title?
    I ain’t saying your content is not solid., but suppose you added a post title that makes people want more?
    I mean ozenero | Mobile & Web Programming Tutorials is kinda plain. You should peek at
    Yahoo’s home page and see how they create news titles to grab
    viewers to click. You might add a related video or
    a pic or two to grab readers interested about what you’ve got to say.
    In my opinion, it could make your blog a little livelier.

  24. I am not sure where you are getting your info,
    but great topic. I needs to spend some time learning more or understanding more.

    Thanks for magnificent info I was looking for this information for my mission.

  25. Hey there! I simply would like to give you a huge thumbs up for the
    great information you have here on this post. I am coming back
    to your site for more soon.

  26. Hi i am kavin, its my first time to commenting anywhere, when i read this
    piece of writing i thought i could also
    create comment due to this good article.

  27. Today, I went to the beachfront with my kids.

    I found a sea shell and gave it to my 4 year old daughter
    and said “You can hear the ocean if you put this to your ear.” She placed the shell to her ear
    and screamed. There was a hermit crab inside and it
    pinched her ear. She never wants to go back! LoL
    I know this is totally off topic but I had to tell someone!

  28. I’m not that much of a internet reader to be honest but your blogs really nice, keep it up!
    I’ll go ahead and bookmark your site to come back in the future.
    Many thanks

  29. I’m impressed, I must say. Seldom do I encounter a blog that’s both educative and entertaining, and without a doubt, you have hit the nail on the head.
    The issue is something which not enough people are speaking intelligently about.

    Now i’m very happy I came across this during my hunt
    for something concerning this.

  30. I think what you composed was very logical.
    However, think on this, suppose you composed a catchier post title?

    I am not suggesting your content is not solid., however
    what if you added something that grabbed people’s attention? I
    mean ozenero | Mobile & Web Programming Tutorials is kinda
    plain. You might peek at Yahoo’s front page and note how they write article headlines to grab people
    interested. You might try adding a video or a pic or two to
    get readers interested about everything’ve got to say.
    In my opinion, it would make your posts a little
    bit more interesting.

  31. Excellent pieces. Keep writing such kind of info on your
    page. Im really impressed by your site.
    Hey there, You have performed a great job. I will certainly
    digg it and individually suggest to my friends.

    I am confident they’ll be benefited from this website.

  32. First of all I would like to say great blog! I had a quick question that I’d like to
    ask if you don’t mind. I was interested to know how you center yourself and clear your thoughts prior to writing.
    I’ve had a tough time clearing my thoughts in getting my
    ideas out there. I truly do take pleasure in writing however it just seems like the
    first 10 to 15 minutes tend to be lost simply just trying to figure out how to begin. Any suggestions
    or tips? Cheers!

  33. Hiya! I know this is kinda off topic but I’d figured
    I’d ask. Would you be interested in exchanging links or maybe guest authoring
    a blog post or vice-versa? My website goes over a lot of the same subjects as yours and I
    feel we could greatly benefit from each other. If you are interested feel free to shoot me
    an email. I look forward to hearing from you!
    Terrific blog by the way!

  34. I was curious if you ever thought of changing
    the structure of your site? Its very well written; I love what youve
    got to say. But maybe you could a little more in the way
    of content so people could connect with it better.
    Youve got an awful lot of text for only having one or 2 pictures.
    Maybe you could space it out better?

  35. Superb site you have here but I was wanting to know if you knew of any community
    forums that cover the same topics talked about in this article?
    I’d really like to be a part of community
    where I can get opinions from other knowledgeable people that share the same interest.

    If you have any recommendations, please let me know.
    Thanks a lot!

  36. Woah! I’m really loving the template/theme of this site. It’s simple, yet effective.
    A lot of times it’s hard to get that “perfect balance” between usability and visual appeal.
    I must say you’ve done a excellent job with this.
    Additionally, the blog loads very quick for me on Internet explorer.

    Exceptional Blog!

  37. Attractive component to content. I simply stumbled upon your weblog and in accession capital to claim that
    I acquire in fact enjoyed account your blog posts.
    Anyway I’ll be subscribing for your augment and even I achievement you get entry to consistently
    rapidly.

  38. Have you ever thought about writing an ebook or guest authoring on other sites?
    I have a blog based upon on the same subjects you discuss and would really like
    to have you share some stories/information. I know
    my audience would appreciate your work. If you are even remotely interested, feel free to shoot me
    an email.

  39. Hi there! I understand this is sort of off-topic however I needed to
    ask. Does building a well-established website such as yours require a
    massive amount work? I am completely new to
    writing a blog but I do write in my diary everyday. I’d like to start a blog
    so I can share my personal experience and thoughts
    online. Please let me know if you have any suggestions
    or tips for brand new aspiring bloggers. Thankyou!

  40. After I originally commented I appear to have clicked on the -Notify
    me when new comments are added- checkbox and from now
    on each time a comment is added I recieve four emails with the
    same comment. Perhaps there is a means you are able to remove me from that service?
    Many thanks!

  41. Wow that was odd. I just wrote an incredibly long comment but after I clicked submit my comment didn’t appear.
    Grrrr… well I’m not writing all that over again. Anyhow, just wanted to say great blog!

  42. Do you mind if I quote a couple of your articles
    as long as I provide credit and sources back to your website?
    My blog site is in the exact same niche as yours and
    my visitors would really benefit from a lot of the information you present here.
    Please let me know if this alright with you.
    Cheers!

  43. Woah! I’m really enjoying the template/theme of this website.
    It’s simple, yet effective. A lot of times it’s very difficult to get
    that “perfect balance” between superb usability and visual appearance.
    I must say you’ve done a very good job with this. Also, the blog loads very fast for me on Safari.
    Exceptional Blog!

  44. Excellent article. Keep posting such kind of info on your blog.
    Im really impressed by it.
    Hi there, You’ve done a great job. I’ll certainly digg it and individually
    suggest to my friends. I am confident they’ll be benefited from this
    web site.

  45. It is perfect time to make some plans for the future and it is time to
    be happy. I’ve read this post and if I could I want to suggest you few interesting things or
    suggestions. Perhaps you could write next articles referring to this article.
    I wish to read even more things about it!

  46. Hey there! I know this is kinda off topic nevertheless I’d figured I’d
    ask. Would you be interested in exchanging links or maybe guest writing a
    blog article or vice-versa? My website addresses a lot of
    the same topics as yours and I feel we could greatly
    benefit from each other. If you might be interested
    feel free to send me an e-mail. I look forward to
    hearing from you! Awesome blog by the way!

  47. I’m gone to tell my little brother, that he should also
    pay a visit this weblog on regular basis to
    obtain updated from most up-to-date gossip.

  48. I do agree with all of the ideas you’ve introduced on your post.
    They are really convincing and will certainly work. Still,
    the posts are very short for novices. Could you please lengthen them
    a bit from next time? Thank you for the post.

  49. Write more, thats all I have to say. Literally, it seems as though you relied on the video to make your point.
    You clearly know what youre talking about, why throw away your intelligence on just posting videos
    to your blog when you could be giving us something informative to read?

  50. Hmm it looks like your website ate my first comment (it was extremely long) so I guess I’ll just
    sum it up what I submitted and say, I’m thoroughly enjoying your blog.
    I as well am an aspiring blog writer but I’m still new to the whole thing.

    Do you have any helpful hints for newbie blog writers?

    I’d genuinely appreciate it.

  51. Hmm is anyone else encountering problems with the images on this blog loading?
    I’m trying to determine if its a problem on my end or
    if it’s the blog. Any responses would be greatly
    appreciated.

  52. May I simply just say what a comfort to discover a person that actually understands what they are discussing online.
    You actually understand how to bring an issue to light
    and make it important. More and more people should look
    at this and understand this side of your story. I can’t believe you are not more popular since you certainly possess the gift.

  53. You’re so awesome! I don’t think I’ve truly read anything like that before.
    So nice to discover somebody with some unique thoughts on this subject.
    Seriously.. thanks for starting this up. This website is something
    that is needed on the web, someone with a little originality!

  54. you’re really a excellent webmaster. The web site
    loading speed is incredible. It seems that you’re doing any unique trick.
    In addition, The contents are masterwork. you have performed a magnificent process in this
    matter!

  55. I simply could not leave your web site prior to suggesting that I extremely
    enjoyed the standard information a person provide on your
    guests? Is going to be again steadily in order
    to check out new posts

  56. I’m not that much of a internet reader to be honest but your blogs really nice,
    keep it up! I’ll go ahead and bookmark your website to come back down the road.
    Many thanks

  57. When I originally commented I clicked the “Notify me when new comments are added”
    checkbox and now each time a comment is added I get four e-mails
    with the same comment. Is there any way you can remove
    people from that service? Appreciate it!

  58. With havin so much content do you ever run into any issues of
    plagorism or copyright violation? My blog has a lot
    of unique content I’ve either authored myself or outsourced but it
    looks like a lot of it is popping it up all over the internet without my authorization.
    Do you know any ways to help stop content from being stolen? I’d definitely appreciate it.

  59. Hey I know this is off topic but I was wondering if you knew of
    any widgets I could add to my blog that automatically tweet my
    newest twitter updates. I’ve been looking for a plug-in like
    this for quite some time and was hoping maybe you would have some experience with something
    like this. Please let me know if you run into anything.
    I truly enjoy reading your blog and I look forward to your new updates.

  60. Howdy I am so excited I found your blog, I really found you by error, while
    I was looking on Bing for something else, Regardless I am here now and
    would just like to say kudos for a incredible post and
    a all round enjoyable blog (I also love the theme/design),
    I don’t have time to browse it all at the minute but I have
    saved it and also added in your RSS feeds, so when I have
    time I will be back to read much more, Please do keep up the excellent job.

  61. Just wish to say your article is as astonishing. The clarity for your post
    is just spectacular and i can suppose you are an expert on this subject.

    Fine along with your permission allow me to clutch your RSS
    feed to keep up to date with drawing close post.
    Thank you one million and please carry on the rewarding work.

  62. Heya superb blog! Does running a blog such as this take a large amount of work?
    I’ve very little expertise in computer programming however I had been hoping to start my own blog soon. Anyway, if you have any recommendations or
    techniques for new blog owners please share. I understand this is off subject nevertheless
    I just needed to ask. Appreciate it!

  63. I am curious to find out what blog platform you happen to be working with?
    I’m having some small security problems with my latest site and I would like to find something more risk-free.

    Do you have any suggestions?

  64. Good day very nice website!! Man .. Excellent ..
    Superb .. I will bookmark your blog and take the feeds also?

    I’m happy to search out a lot of helpful info right here in the post, we’d like work out
    more techniques in this regard, thank you for sharing. . . .
    . .

  65. It is appropriate time to make a few plans for the long run and it
    is time to be happy. I’ve learn this post and if I could I desire to suggest
    you few fascinating things or advice. Maybe you can write subsequent articles referring to this
    article. I wish to learn even more issues about it!

  66. Your evaluation is incredibly interesting. If you need to perceive bandar slot, I recommend playing upon reputable situs slot
    gacor sites. As you can obtain big profits and obtain certain pay-out chances.
    If you want to see, you could straight take a peek through
    on this page. The web link is truly a slot machine game site
    that is certainly frequently used among Indonesia online players.

  67. Does your site have a contact page? I’m having problems locating it but,
    I’d like to shoot you an e-mail. I’ve got some ideas for your blog you might be interested in hearing.
    Either way, great site and I look forward to seeing it develop over time.

  68. Does your site have a contact page? I’m having a tough time locating it but,
    I’d like to send you an email. I’ve got some suggestions for your blog you might be
    interested in hearing. Either way, great website
    and I look forward to seeing it develop over time.

  69. I’ll right away take hold of your rss feed as I can not find your e-mail subscription link or newsletter service.
    Do you have any? Please permit me understand so that I may subscribe.
    Thanks.

  70. I am really loving the theme/design of your web site. Do you ever run into any internet browser compatibility
    issues? A small number of my blog visitors
    have complained about my website not operating correctly in Explorer but looks great in Chrome.

    Do you have any suggestions to help fix this problem?

  71. I was recommended this blog by my cousin. I am not sure whether this post is written by him as no one else know such detailed about my trouble.
    You’re amazing! Thanks!

  72. Pretty component of content. I just stumbled upon your web site and in accession capital to say that I get in fact loved account your blog posts.
    Any way I will be subscribing on your feeds or even I fulfillment you access constantly quickly.

  73. Hello! This is my first visit to your blog!
    We are a group of volunteers and starting a new initiative in a community
    in the same niche. Your blog provided us valuable
    information to work on. You have done a wonderful job!

  74. Howdy, I believe your website could possibly be having browser compatibility issues.
    When I take a look at your web site in Safari, it looks fine but when opening in IE, it has some overlapping
    issues. I simply wanted to provide you with a quick heads up!

    Apart from that, wonderful blog!

  75. Excellent blog here! Also your web site a lot up very fast!
    What web host are you using? Can I get your affiliate
    hyperlink to your host? I wish my website loaded up as
    quickly as yours lol

  76. Good day! I just would like to offer you a huge
    thumbs up for your excellent info you have got right here on this post.
    I will be returning to your web site for more soon.

  77. Hi! Do you know if they make any plugins to assist with Search
    Engine Optimization? I’m trying to get my blog to rank for some
    targeted keywords but I’m not seeing very good gains. If you know of any please share.

    Kudos!

  78. It is perfect time to make some plans for the long run and it is
    time to be happy. I’ve learn this put up and if I
    could I wish to counsel you some fascinating issues or advice.

    Perhaps you can write next articles relating to this article.
    I desire to learn even more issues about it!

  79. Its like you read my thoughts! You appear to grasp a lot approximately this, like you wrote the e-book in it or something.
    I think that you could do with some percent to force the message house a little bit, however instead
    of that, that is magnificent blog. A fantastic read.
    I will definitely be back.

  80. You really make it seem really easy with your presentation but I find
    this topic to be actually something which I feel I might by no means
    understand. It seems too complicated and very extensive for me.
    I am having a look ahead on your next post, I will attempt to get
    the grasp of it!

  81. Hey There. I found your weblog the use of
    msn. That is a really well written article.
    I will make sure to bookmark it and return to read extra of your helpful info.
    Thanks for the post. I’ll definitely return.

  82. Hello terrific blog! Does running a blog such as this
    require a large amount of work? I have virtually no knowledge of coding but I was hoping
    to start my own blog soon. Anyways, should you have any ideas or tips for new blog owners
    please share. I know this is off topic however I simply needed to ask.
    Thanks a lot!

  83. Hi would you mind letting me know which hosting company you’re
    working with? I’ve loaded your blog in 3 completely different
    browsers and I must say this blog loads a lot quicker
    then most. Can you suggest a good hosting provider at a fair price?
    Cheers, I appreciate it!

  84. I’m impressed, I have to admit. Rarely do I come across a blog that’s equally educative
    and interesting, and without a doubt, you’ve hit the nail on the head.

    The problem is something which not enough people are speaking intelligently
    about. I am very happy I stumbled across this in my search for something concerning this.

  85. An impressive share! I’ve just forwarded this onto a colleague who was doing a little homework on this.
    And he actually bought me lunch because I found it for him…
    lol. So allow me to reword this…. Thank YOU for the meal!!
    But yeah, thanx for spending time to talk about this issue here on your blog.

  86. I’ve been surfing online more than 3 hours today, yet I never found any interesting article like yours.

    It’s pretty worth enough for me. In my view, if all webmasters and bloggers made good
    content as you did, the web will be a lot more useful than ever before.

  87. Write more, thats all I have to say. Literally, it seems as though you relied on the video to make
    your point. You clearly know what youre talking about, why throw away your intelligence on just posting videos to your weblog when you could be giving us something informative to read?

  88. Please let me know if you’re looking for a writer for your blog.
    You have some really good posts and I believe I would be
    a good asset. If you ever want to take some of the load off, I’d absolutely love to write some material for
    your blog in exchange for a link back to mine. Please blast me an e-mail if
    interested. Kudos!

  89. Attractive element of content. I simply stumbled upon your website and in accession capital to assert that I get in fact enjoyed account
    your blog posts. Anyway I’ll be subscribing in your feeds or even I fulfillment you get right of
    entry to constantly quickly.

  90. I’m truly enjoying the design and layout of your site.
    It’s a very easy on the eyes which makes it much more pleasant for me to come here and visit more often. Did you hire out a developer to
    create your theme? Exceptional work!

  91. You are so awesome! I do not suppose I have read through a single thing
    like that before. So great to find another person with a few original
    thoughts on this subject. Really.. thank you for starting this up.
    This site is one thing that’s needed on the internet, someone with a little originality!

  92. A motivating discussion is worth comment.

    I do think that you need to publish more on this subject
    matter, it may not be a taboo matter but generally people
    don’t speak about these subjects. To the next!

    Best wishes!!

  93. Howdy, i read your blog occasionally and i own a similar one and
    i was just wondering if you get a lot of spam feedback?
    If so how do you protect against it, any plugin or anything you can suggest?
    I get so much lately it’s driving me crazy so any help is very
    much appreciated.

  94. My coder is trying to persuade me to move to .net from PHP.

    I have always disliked the idea because of the costs. But he’s tryiong none the less.

    I’ve been using WordPress on numerous websites for about a year and am anxious about switching
    to another platform. I have heard good things about blogengine.net.

    Is there a way I can transfer all my wordpress
    posts into it? Any kind of help would be greatly appreciated!

  95. Hello there, just became alert to your blog through Google,
    and found that it is truly informative. I’m gonna watch out for brussels.

    I will be grateful if you continue this in future. A lot of people will be benefited from your writing.
    Cheers!

  96. I needed to thank you for this very good read!!
    I definitely enjoyed every little bit of it. I have got you book marked to look at new stuff you post…

  97. Thank you for the auspicious writeup. It in fact was a amusement account it.
    Look advanced to far added agreeable from you! However, how can we communicate?

  98. Hey there! Someone in my Facebook group shared this website with us so I came to check
    it out. I’m definitely enjoying the information. I’m book-marking and will be tweeting this to my
    followers! Terrific blog and outstanding design.

  99. I’m no longer positive the place you’re getting your info, however good topic.
    I must spend a while finding out more or understanding more.
    Thanks for wonderful information I was on the lookout for this information for my mission.

  100. With havin so much content and articles do you ever run into any issues of plagorism or copyright infringement?
    My site has a lot of completely unique content I’ve either created myself or outsourced
    but it appears a lot of it is popping it up all over the web without my
    authorization. Do you know any methods to help reduce content from being stolen? I’d certainly appreciate it.

  101. Right here is the right blog for anyone who wishes to find
    out about this topic. You understand a whole lot its almost hard to argue with you (not that I personally would want
    to…HaHa). You definitely put a new spin on a topic
    that’s been discussed for years. Great stuff, just great!

  102. I really like your blog.. very nice colors & theme. Did you design this website
    yourself or did you hire someone to do it for you?
    Plz answer back as I’m looking to create my own blog and would like to
    find out where u got this from. thanks a lot

  103. Good day! Would you mind if I share your blog with my twitter group?

    There’s a lot of folks that I think would really
    enjoy your content. Please let me know. Thanks

  104. Excellent beat ! I wish to apprentice while you amend your site, how could i subscribe for a
    blog web site? The account helped me a acceptable deal. I had been tiny
    bit acquainted of this your broadcast provided bright clear concept

  105. Hello there! This is kind of off topic but I need some advice from
    an established blog. Is it very difficult to set up your own blog?
    I’m not very techincal but I can figure things out pretty fast.

    I’m thinking about creating my own but I’m not sure where to begin. Do you have any tips or suggestions?
    Thanks

  106. I was very pleased to discover this page. I wanted to thank you for your
    time for this particularly fantastic read!!
    I definitely savored every part of it and i also have you saved as a favorite to see new things in your web site.

  107. Woah! I’m really digging the template/theme of this website.
    It’s simple, yet effective. A lot of times it’s difficult to get that “perfect balance” between user friendliness
    and visual appearance. I must say that you’ve done a fantastic job with this.
    In addition, the blog loads extremely quick for me on Safari.
    Outstanding Blog!

  108. Hey there would you mind letting me know which hosting company you’re
    using? I’ve loaded your blog in 3 completely different internet browsers and I must say this blog
    loads a lot faster then most. Can you suggest a good hosting provider
    at a reasonable price? Thank you, I appreciate it!

  109. Write more, thats all I have to say. Literally, it seems as
    though you relied on the video to make your point. You clearly know what youre talking about, why throw away your intelligence
    on just posting videos to your site when you could be
    giving us something informative to read?

  110. Howdy great blog! Does running a blog similar to this require a lot of work?

    I’ve no expertise in computer programming but I was
    hoping to start my own blog in the near future. Anyways, if you
    have any ideas or tips for new blog owners please share.
    I know this is off topic however I just needed to ask. Thanks!

  111. I know this if off topic but I’m looking into starting my own blog and was curious what all is required to get set up?
    I’m assuming having a blog like yours would cost a pretty penny?

    I’m not very web smart so I’m not 100% certain. Any recommendations or advice would be greatly appreciated.
    Appreciate it

  112. I’d like to thank you for the efforts you’ve put in penning this site.
    I really hope to see the same high-grade content from you later
    on as well. In fact, your creative writing abilities has motivated me to get my own, personal
    site now 😉

  113. Undeniably believe that which you said. Your favorite
    reason appeared to be on the net the easiest thing to be aware of.
    I say to you, I definitely get irked while people think about worries that they plainly don’t know
    about. You managed to hit the nail upon the top as well as defined
    out the whole thing without having side effect , people can take
    a signal. Will probably be back to get more. Thanks

  114. Greate pieces. Keep writing such kind of info on your blog.

    Im really impressed by your blog.
    Hey there, You have done an incredible job. I will certainly digg it and individually
    suggest to my friends. I’m sure they will be benefited from this web site.

  115. I have been surfing online more than three hours today, yet I never found
    any interesting article like yours. It is pretty worth enough for me.

    In my opinion, if all website owners and bloggers made good content as you did,
    the internet will be a lot more useful than ever before.

  116. I’m truly enjoying the design and layout of your website.
    It’s a very easy on the eyes which makes it much more
    pleasant for me to come here and visit more often. Did you hire out
    a designer to create your theme? Superb work!

  117. Heya i am for the first time here. I came across this board and I
    to find It truly helpful & it helped me out much.

    I hope to present something again and aid others such as you aided me.

  118. You are so interesting! I do not suppose I’ve read a single thing
    like this before. So nice to find another person with genuine thoughts on this topic.
    Seriously.. many thanks for starting this up. This website is
    one thing that’s needed on the web, someone with some originality!

  119. Does your website have a contact page? I’m having trouble locating it but, I’d like to shoot
    you an email. I’ve got some creative ideas for your blog you might be interested in hearing.

    Either way, great site and I look forward to seeing it grow over time.

  120. I’ve read some good stuff here. Certainly value bookmarking
    for revisiting. I surprise how so much effort you put to
    make this sort of fantastic informative site.

  121. I’m really loving the theme/design of your website.
    Do you ever run into any internet browser compatibility issues?
    A small number of my blog audience have complained about my site not working correctly in Explorer but looks great in Opera.
    Do you have any advice to help fix this issue?

  122. Wow, incredible blog layout! How long have you been blogging for?
    you make blogging look easy. The overall look of your
    site is fantastic, as well as the content!

  123. My developer is trying to convince me to move to .net from PHP.

    I have always disliked the idea because of the costs. But he’s tryiong none the less.
    I’ve been using Movable-type on a variety of websites for about a year and am anxious about switching to another platform.
    I have heard good things about blogengine.net.

    Is there a way I can import all my wordpress posts into it?
    Any kind of help would be really appreciated!

  124. you are really a good webmaster. The website loading velocity is incredible.

    It kind of feels that you are doing any distinctive trick. Furthermore,
    The contents are masterwork. you have done a magnificent task on this
    topic!

  125. My coder is trying to persuade me to move to .net from
    PHP. I have always disliked the idea because of the costs.
    But he’s tryiong none the less. I’ve been using Movable-type on numerous websites for about a year
    and am nervous about switching to another platform.
    I have heard great things about blogengine.net.
    Is there a way I can transfer all my wordpress posts into
    it? Any help would be greatly appreciated!

  126. I love your blog.. very nice colors & theme. Did you design this website
    yourself or did you hire someone to do it for you? Plz reply
    as I’m looking to design my own blog and would like to know where u got this from.
    thanks a lot

  127. Appreciating the hard work you put into your website
    and detailed information you provide. It’s awesome to come
    across a blog every once in a while that isn’t the same outdated rehashed material.
    Great read! I’ve saved your site and I’m adding
    your RSS feeds to my Google account.

  128. I am really enjoying the theme/design of your weblog.
    Do you ever run into any web browser compatibility issues?
    A number of my blog visitors have complained about my site
    not operating correctly in Explorer but looks great in Chrome.

    Do you have any ideas to help fix this issue?

  129. I don’t know whether it’s just me or if everybody
    else encountering issues with your website. It appears like some of the written text on your content are running
    off the screen. Can someone else please comment and let me know if
    this is happening to them as well? This may be a issue with my internet browser because I’ve had this happen before.
    Kudos

  130. I really like your blog.. very nice colors & theme.

    Did you create this website yourself or did you hire someone to do it for you?
    Plz reply as I’m looking to construct my own blog and would like to know where u got this from.
    appreciate it

  131. You actually make it seem so easy with your presentation but I find this matter to
    be really something that I think I would never understand.
    It seems too complicated and very broad for me.
    I am looking forward for your next post, I will try to get
    the hang of it!

  132. Hey I know this is off topic but I was wondering if you knew of any widgets I could add to my
    blog that automatically tweet my newest twitter
    updates. I’ve been looking for a plug-in like this for quite some time and was hoping maybe you would have some experience with something like
    this. Please let me know if you run into anything.
    I truly enjoy reading your blog and I look forward to your
    new updates.

  133. Hi I am so delighted I found your webpage, I really found you
    by mistake, while I was browsing on Google for something else, Anyways I am here
    now and would just like to say thanks a lot for a remarkable post and a all round exciting blog (I also love the theme/design),
    I don’t have time to look over it all at the moment but I have saved it and
    also added your RSS feeds, so when I have time I will be back to read much more, Please do keep up the great work.

  134. When I originally commented I appear to have clicked on the -Notify me when new comments are added- checkbox and from now on whenever a comment is added I receive 4 emails with the same comment.
    Perhaps there is an easy method you are able to remove me from that service?

    Thank you!

  135. Thanks for every other informative site. The place else may I am getting that type of information written in such a
    perfect way? I’ve a challenge that I am simply now working on, and I’ve been on the
    glance out for such info.

  136. We are a group of volunteers and starting a new scheme in our
    community. Your web site provided us with valuable information to work on. You
    have done an impressive job and our whole community will
    be grateful to you.

  137. Greetings I am so thrilled I found your weblog, I really found you by error,
    while I was browsing on Yahoo for something else, Regardless I am here now
    and would just like to say kudos for a incredible post
    and a all round thrilling blog (I also love the theme/design),
    I don’t have time to read it all at the moment but I have bookmarked it and also included your RSS feeds,
    so when I have time I will be back to read much more, Please do keep up the great
    work.

  138. I believe everything published made a ton of sense. But, think on this, what if you
    wrote a catchier post title? I ain’t suggesting your information is not good., but what
    if you added something that makes people desire more? I mean ozenero | Mobile & Web Programming
    Tutorials is a little plain. You might look at Yahoo’s home page
    and see how they create article headlines to grab viewers interested.
    You might add a video or a related picture or two to grab people interested about everything’ve written. In my opinion, it could make your
    website a little bit more interesting.

  139. If you desire to increase your know-how simply keep visiting this web site and be updated with
    the most up-to-date news update posted here.

  140. obviously like your web site however you need to test the spelling on quite a few of your posts.

    Several of them are rife with spelling problems and I find it very
    troublesome to tell the truth then again I’ll certainly
    come back again.

  141. Does your blog have a contact page? I’m having problems locating
    it but, I’d like to send you an e-mail. I’ve got some creative ideas for your blog you might
    be interested in hearing. Either way, great website and I look
    forward to seeing it develop over time.

  142. It’s a pity you don’t have a donate button! I’d definitely donate to this fantastic
    blog! I suppose for now i’ll settle for book-marking and adding your RSS feed
    to my Google account. I look forward to fresh updates and will share this site with my Facebook group.
    Chat soon!

  143. My spouse and I absolutely love your blog and find most of your post’s
    to be exactly what I’m looking for. Do you offer guest writers to write content for you?
    I wouldn’t mind publishing a post or elaborating on a number of the subjects you write with regards to here.
    Again, awesome web site!

  144. I’m not sure why but this web site is loading incredibly
    slow for me. Is anyone else having this problem or is
    it a problem on my end? I’ll check back later on and see if the problem still exists.

  145. Its like you learn my mind! You seem to grasp a lot approximately this, like you wrote the ebook in it or something.

    I feel that you just could do with a few p.c.
    to force the message house a bit, however instead of that,
    this is magnificent blog. A fantastic read. I’ll
    definitely be back.

  146. Howdy just wanted to give you a quick heads up. The words in your content seem to be running off
    the screen in Firefox. I’m not sure if this is a format
    issue or something to do with browser compatibility but I figured I’d post to
    let you know. The design look great though! Hope you get the issue
    solved soon. Cheers

  147. Good day! This post couldn’t be written any better! Reading
    through this post reminds me of my previous room mate!
    He always kept talking about this. I will forward this write-up to him.
    Pretty sure he will have a good read. Thank you for sharing!

  148. Appreciating the time and energy you put into your blog and
    in depth information you present. It’s awesome to come across a blog every once in a
    while that isn’t the same outdated rehashed material. Wonderful read!

    I’ve saved your site and I’m including your RSS feeds
    to my Google account.

  149. I do not know if it’s just me or if perhaps everyone else experiencing problems with your blog.
    It appears like some of the written text within your content are running off the screen.
    Can somebody else please comment and let me know if this is happening
    to them too? This could be a issue with my internet browser because I’ve had
    this happen previously. Thank you

  150. Thanks for ones marvelous posting! I quite enjoyed reading
    it, you might be a great author.I will be sure
    to bookmark your blog and will eventually come back someday.
    I want to encourage you to ultimately continue your great job, have a nice day!

  151. Good post. I learn something totally new and challenging on blogs I stumbleupon everyday.

    It will always be useful to read content from other writers
    and use something from other websites.

  152. Nice post. I was checking continuously this weblog and I’m inspired!
    Very useful info particularly the last section 🙂 I take care of such information much.
    I used to be seeking this particular info for a long time.
    Thank you and best of luck.

  153. Hey there would you mind letting me know which webhost
    you’re working with? I’ve loaded your blog in 3 completely different
    browsers and I must say this blog loads a lot faster then most.
    Can you suggest a good hosting provider at a fair price?
    Cheers, I appreciate it!

  154. You are so cool! I do not think I have read through anything like
    this before. So wonderful to find somebody with unique thoughts on this subject
    matter. Seriously.. thanks for starting this up.
    This site is one thing that is required on the web, someone with some originality!

  155. My developer is trying to convince me to move to .net from PHP.
    I have always disliked the idea because of the expenses.
    But he’s tryiong none the less. I’ve been using WordPress on several websites for about a year and am worried about switching to another platform.
    I have heard great things about blogengine.net. Is there a way I
    can transfer all my wordpress posts into it? Any help would be really
    appreciated!

  156. Hi! I could have sworn I’ve been to this blog before but after browsing through a few of the articles I realized it’s new to me. Anyhow, I’m certainly pleased I came across it and I’ll be book-marking it and checking back regularly!

  157. Most of what you assert happens to be astonishingly precise and it makes me wonder the reason why I had not looked at this in this light before. This piece truly did turn the light on for me as far as this subject matter goes. Nonetheless at this time there is one issue I am not really too comfortable with and while I try to reconcile that with the actual main idea of the point, permit me see what all the rest of the visitors have to say.Nicely done.

  158. Thanks for your personal marvelous posting! I certainly enjoyed reading it, you happen to be a great author.I will remember to bookmark your blog and will often come back in the foreseeable future. I want to encourage continue your great writing, have a nice morning!

  159. I’m glad I found this web site, I couldn’t find any knowledge on this matter prior to.Also operate a site and if you are ever interested in doing some visitor writing for me if possible feel free to let me know, im always look for people to check out my web site.

  160. Hi there, simply turned into alert to your blog via Google, and located that it’s really informative. I am going to be careful for brussels. I will be grateful in case you proceed this in future. Lots of people shall be benefited out of your writing. Cheers!

Leave a Reply

Your email address will not be published.