npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

voogpagination

v1.0.1

Published

A jQuery pagination plugin for the Voog CMS

Downloads

3

Readme

voogPagination

voogPagination is a jQuery-based front-end pagination plugin for the Voog CMS. It utilizes Voog's public API (https://www.voog.com/developers/api) and can be used to paginate elements, articles and comments. This plugin is js only, i.e. there are no default themes or CSS styles included.

Getting started

You can either use a package manager or download the latest release from this GitHub repo.

# Bower
bower install --save voogpagination

# NPM
npm install voogpagination

Initializing

<div class="js-paginatedArticles"></div>
<script>
  $(document).ready(function() {
    var settings = {
      parentId: {{page.id}}
    };
    $('.js-paginatedArticles').voogPagination(settings);
  });
</script>

Settings

Option | Type | Default | Description ------ | ---- | ------- | ----------- ajaxErrorHandler | function | null | Called on ajax request errors. See the source and examples for reference. cachePages | boolean | true | Whether to cache the fetched items. dateFormatter | function | null | Overrides the itemTemplates function used for date formatting. See examples section for more info. defaultNotifications | Object | {} | Contains the notification settings. All notifications are rendered inside the messageTemplate. defaultNotifications.noItems | string | 'No items to display.' | Shown when there are no items to render. defaultNotifications.error | string | 'Oops! Something went wrong! <br> Try refreshing the page or check back soon' | Shown as a general error message. May contain html tags. enablePageUrls | boolean | true | Whether to display pagination queries in the url. eventNameSpace | string | '.vp' | Used to namespace voogPagination's events. hashPrefix | string | 'page-' | Change the hash prefix. Only applicable if the urlFormat is set to 'hash'. hashSuffix | string | '' | Change the hash suffix. Only applicable if the urlFormat is set to 'hash'. initClass | string | 'voogPagination-initialized' | Html class attribute added to the pagination wrapper on initialization. itemTemplate | function | null | Takes two aguments - item (either article, comment or element object) and dateFormatter (function). Has to return a string. See the examples section and the source for more info. itemWrapper | function | null | Useful for when you don't want to override the entire item template, but just want to wrap every item in some html. See the examples section for more info. itemType | string | 'article' | Which type of items to paginate, possible values are: 'article', 'element' and 'comment'. messageTemplate | function | null | Used for rendering notifications. See the examples section for more info. navigation | Object | {} | Contains the navigation settings. navigation.container | string | null | className or id of the container into where the navigation should be rendered. By default, navigation is rendered at the bottom of the items' parent element. navigation.totalLength | number | 9 | The total number of navItems to render excluding thr first and last page links. navigation.edgeLength | number | 1 | How many edge navitems should be rendered. ScreenShot parentId | string | null | Id of the page from where the paginated items should be fetched, e.g. your blog id or elements page id. If you do not provide an id, all articles or elements will be fetched. perPage | number | 12 | How many items to display per page. queryKey | string | 'page' | Change the query prefix. Only applicable if the urlFormat is set to 'singleQueryVar'. queryVars | string | null | Useful for filtering and sorting paginated items. See Voog's documentation for all the possible values. renderItemsOnFirstFetch | boolean | true | Whether to render the paginated items on initialize. You might want to set this to false if you are already rendering the items in your template. See the examples for more info. requestUrlBuilder | function | null | Used to override defaultRequestUrlBuilder. See the source for more info. startingPage | number | 1 | Which page to display at start. urlFormat | string | 'fullQuery' | In which format to display the query portion of the url. Possible values: 'fullQuery', 'singleQueryVar', 'hash'. useHistoryPushState | boolean | true | Whether to use browsers history push state api to keep reference of previous queries and enable the browsers back and forward button functionality.

Methods

You can call methods through the voogPagination instance. e.g:

$('.js-pagedArticles').voogPagination('goToPage', 4);

Method | Argument | Description ------ | -------- | ----------- currentInstance | | Returns the current voogPagination instance. goToPage | target: int | Go to page by number. goToNextPage | | Go to the next page. goToPrevPage | | Go to the previous page. goToFirstPage | | Go to the first page. goToLastPage | | Go to the last page. destroy | | Remove all the DOM nodes that were created by the current instance. refresh | | Rerender everything.

Events

Event | Params | Description ----- | ------ | ----------- beforeUrlUpdate | event, voogPagination, {query, pageNr, urlFormat} | Triggered before updating the url. afterUrlUpdate | event, voogPagination, {query, pageNr, urlFormat} | Triggered after updating the url. fetchStart | event, voogPagination, {requestUrl, pageNr} | Triggered before the ajax request. fetchDone | event, voogPagination, {res, status, xhr} | Triggered in the jQuery ajax done callback. fetchFail | event, voogPagination, {xhr, status, errorThrown} | Triggered in the jQuery ajax fail callback. beforeRender | event, voogPagination, params | Triggered before rendering items and nav. initialized | event, voogPagination | Triggered after the plugin has been initialized. afterRender | event, voogPagination, params | Triggered after rendering the items and nav. beforeDestroy | event, voogPagination | Triggered before executing the destroy method. afterDestroy | event, voogPagination | Triggered after executing the destroy method.

Examples

Paginating articles

<div class="js-paginatedArticles"></div>
<script>
  $(document).ready(function() {
    $('.js-paginatedArticles').voogPagination({
      parentId: {{page.id}},
    });
  });
</script>

Paginating comments

<div class="js-paginatedComments"></div>
<script>
  $(document).ready(function() {
    $('.js-paginatedComments').voogPagination({
      itemType: 'comment',
      parentId: {{article.id}}
    });
  });
</script>

Paginating elements

<div class="js-paginatedItems"></div>
<script>
  $(document).ready(function() {
    $('.js-paginatedItems').voogPagination({
      itemType: 'element',
      parentId: {{page.id}}
    });
  });
</script>

Custom date formatting

Vanilla js

var settings = {
  dateFormatter: function(dateString) {
    var date = new Date(dateString);
    var day = date.getDate();
    var month = date.getMonth() + 1;
    var year = date.getFullYear();
    if (day < 10) {
      day = '0' + day;
    }
    if (month < 10) {
      month = '0' + month;
    }
    return day + '.' + month + '.' + year;
  }
}

With moment.js

var settings = {
  dateFormatter: function(dateString) {
    return moment.utc(item.values.datetime).format('DD.MM.YYYY');
  }
}

Custom notifications

var settings = {
  defaultNotifications: {
    noItems: 'There are no comments yet',
    error: 'Something went bork. <br> Try refreshing the page or check back soon'
  }
}

Ajax error handling

var settings = {
  ajaxErrorHandler: function (renderer, messageTemplate, data) {
    console.log(data);
    renderer(messageTemplate('Some witty and unhelpful error message', 'error'));
  }
}

Custom item templates

A custom template for elements

var settings = {
  itemTemplate: function (item, dateFormatter) {
    var title = '<div class="eventTile_title">' + item.title + '</div>';
    var category = '<div class="eventTile_category">' + item.values.category + '</div>';
    var date = '<div class="eventTile_info">' + dateFormatter(item.values.datetime) + '</div>';
    var location = '<div class="eventTile_location">' + item.values.location + '</div>';
    var button = '<div class="eventTile_button"><a href="' + item.public_url + '">Read more</a></div>';
    var templateString = '<div class="eventTile ' + item.values.category + '">' +
      title +
      category +
      date +
      location +
      button +
      '</div>';
    return templateString;
  }
}

Custom message templates

var settings = 
  messageTemplate = function (message, type) {
    type = type || 'info';
    var typeClass = 'notification-info';
    if (type === 'error') {
      typeClass = 'notification-error';
    }
    var templateString = '<div class="message ' + typeClass + '">' +
      message +
      '</div>';
    return templateString;
  }
}

Wrapping paginated items

var settings = {
  itemWrapper: function (item, index) {
    return '<div class="col-sm-4" data-item-nr="' + index + '">' + item + '</div>';
  }
}

Navigation settings

var settings = {
  navigation: {
    container: '.js-pageNav',
    totalLength: 6,
    edgeLength: 1
  }
}

Sorting and filtering

<div class="catFilter js-eventFilter">
  <label class="catFilter_item" for="category1">
    <input id="category1" type="radio" value="category-1" name="catFilter">
    Category 1
  </label>
  <label class="catFilter_item" for="category2">
    <input id="category2" type="radio" value="category-2" name="catFilter">
    Category 2
  </label>
  <label class="catFilter_item" for="category3">
    <input id="category3" type="radio" value="category-3" name="catFilter">
    Category 3
  </label>
</div>
$('.js-eventFilter input').each(function (index, element) {
  $(element).change(function () {
    // Get current voogPaginations instance
    var paginationInstance = $('.js-pagedItems').voogPagination('currentInstance');

    // Update the settings dynamically
    paginationInstance.options.queryVars = 'q.element.values.category.$matches=' + 
      $(this).val() +
      '&q.element.values.datetime.$gteq=' +
      moment().format('YYYY-MM-DD') +
      '&s=element.values.datetime.$asc';

    // Fetch the first page using the new query vars.
    $('.js-pagedItems').voogPagination('goToFirstPage');
  });
});

Pre rendering in liquid

<div class="events js-paginatedEvents">
  {% elementscontext edicy_model="Event" %}
    {% for event in elements %}
      <div class="eventTile {{ event.category }}">
        <div class="eventTile_title" data-mh="eventTile">{{ event.title }}</div>
        <div class="eventTile_category" data-mh="eventTile">{{ event.category }}</div>
        <div class="eventTile_info" data-mh="eventTile">{{ event.datetime | date: "%Y.%m.%d %H:%M" }}</div>
        <div class="eventTile_button" data-mh="eventTile">
          <a href="{{ event.url }}">Read more</a>
        </div>
      </div>
    {% endfor %}
  {% endelementscontext %}
<div>
<script>
  $(document).ready(function() {
    $('.js-paginatedEvents').voogPagination({
      itemType: 'element',
      parentId: {{page.id}},
      renderItemsOnFirstFetch: false
    });
  });
</script>

Browser support

Browser | Version ------- | ------- Chrome | Latest Firefox | Latest IE | 10+ Edge | Latest Safari | 6.1

Dependencies

jQuery 1.7

License

Copyright (c) 2017 Mats-Joonas Kulla

Licensed under the MIT license.