jPack
jPack is a library of components, objects, plugin wrappers, and utilities designed to make building custom websites simpler.
With jPack, you can easily upgrade your server-side rendered application to a pseudo-SPA using XHR requests for page-loads, get values from the querystring, store and interact with user/multi-tenant website data, and more.
Installation
With Yarn or NPM:
yarn add @htmlguyllc/jpack;
//or
npm i @htmlguyllc/jpack;
and then use what you need, where you need it (requires ES6):
import {strings} from '@htmlguyllc/jpack/src/utilities/strings';
strings.ucfirst('bob');
import {strings} from '@htmlguyllc/jpack/src/utilities';
strings.ucfirst('bob');
import {strings, dom} from '@htmlguyllc/jpack/src/utilities';
strings.ucfirst('bob');
dom.exists('a.my-link');
import * as utilities from '@htmlguyllc/jpack/src/utilities';
utilities.strings.ucfirst('bob');
import {jpack} from '@htmlguyllc/jpack';
jpack.objects.user.getId();
Or you can download the latest release, unzip it, put it in your public folder then include the whole library:
<script href="/vendor/htmlguyllc-jpack/dist/jpack.min.js">
<script>
window.addEventListener('load', function() {
var user_id = jpack.objects.user.getId();
jpack.goGlobal();
var user_id = user.getId();
};
</script>
Dependencies
Name | Required by |
---|
url-search-params-polyfill | request |
What's Included
Four categories of functionality are provided in this library.
Each has it's own namespace in parenthesis below.
Components (components):
navigation
Objects (objects):
request, site, user
Plugin Wrappers (plugin_wrappers):
None yet.
Utilities (utilities):
strings, data_types, dom, events
Documentation
- Components -
-Navigation
Grabs content from a URL and replaces it on the current page (along with browser history button handling, onload/unload handlers, and much more
Method/Property | Params | Return | Notes |
---|
setPassthroughData | mixed | self | set data you want provided in the onload method for the next page |
clearPassthroughData | | self | must be called manually or the data will persist infinitely. you can set an onload callback to clear this every time |
getPassthroughData | | mixed | returns the data you set |
setIncomingElement | string | self | a selector string for the element being retrieved from another page which contains the HTML you want put on the current page |
getIncomingElement | | string | |
setReplaceElement | string | self | a selector string for the element on the current page you want the new HTML to replace |
getReplaceElement | | string | |
load | string,function/null,string/null,string/null,bool | void | pulls content from the provided URL and puts it on the current page - also swaps out the page title, metas, and much more |
loaderEnabled | n/a | bool | property to toggle the slow request loader on/off |
setLoaderDelay | int | self | set how long a request should take in ms before the loader displays |
getLoaderDelay | | self | |
getLoaderEl | | Element | |
showLoader | | self | shows the loader after the delay |
hideLoader | | self | clears the loader timeout and hides it |
parseHTML | string,string | object | parses HTML from the request to get key components like metas and the HTML to be displayed |
getRouteFromMeta | string | string | retrieves the value of a meta tag named "current_route" to be passed in the onload event to help trigger page-specific JS |
replacePageContent | string,string,string,string,bool | self | replaces HTML on the page with the new content, updates metas, runs the unload and load callbacks and more |
reload | function | self | reloads the current page using .load() |
fullReload | | void | performs a full browser refresh of the current page |
redirect | string | void | redirects the user to a new page (no XHR request) |
setTitle | string | self | sets the page title |
onLoad | function | self | add an onload callback (runs 100ms after unload) |
onUnload | function | self | add an unload callback |
onNavigationFailure | function | self | add a callback when the load() request fails - the error message is provided in event.detail.error |
triggerOnLoad | mixed,string,string | self | triggers all onload callbacks |
triggerUnload | mixed | self | triggers all unload callbacks |
triggerNavigationFailure | string | self | triggers the nav failure and provides an error message |
initHistoryHandlers | | self | sets event listeners to handle back/forward navigation in the user's browser |
To use:
import {navigation} from '@htmlguyllc/jpack/src/components';
navigation.initHistoryHandlers();
navigation.setIncomingElement('#main-content');
navigation.setReplaceElement('#main-content');
navigation.loaderEnabled = true;
navigation.setLoaderDelay(300);
navigation.onLoad(function(e){
var params = e.detail;
var route = params.route;
var data = params.data;
var el = params.el;
var el_selector = params.el_selector;
if( typeof gtag !== 'undefined' ) {
gtag('config', 'GA_MEASUREMENT_ID', {
page_path: request.getURIWithQueryString()
});
}
window.scrollTo(0, 0);
});
navigation.onUnload(function(){
});
navigation.onNavigationFailure(function(e){
var error = e.detail.error;
});
navigation.triggerOnLoad(dom.getDomElement('body'), 'body', navigation.getRouteFromMeta());
import {events} from '@htmlguyllc/jpack/src/utilities';
events.onClick('[data-href]', function(){
navigation.load(this.href);
});
navigation.load('/my-page', function(){
});
navigation.load('/my-popup', null, '.popup-content');
navigation.setIncomingElement('.popup-content');
- Objects -
-Request
Provides a wrapper for window.location and query string access
Method/Property | Params | Return | Notes |
---|
query | n/a | URLSearchParams | see https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams#Methods |
isHttps | | bool | |
getDomain | | string | |
getDomainWithProtocol | | string | |
getURI | | string | also known as the path - does not include querystring |
getURIWithQueryString | | string | full URL after the domain |
getFullURL | | string | |
appendSlash | string | string | adds a slash (if there isn't already one) to the end of a string. |
To use:
import {request} from '@htmlguyllc/jpack/src/objects';
var product_id = request.query.get('product_id');
var current_full_url = request.getFullURL();
var full_blog_url = request.appendSlash(request.getDomainWithProtocol())+'blog';
-Site
Designed for multi-tenant applications, this object stores a site's id, name, and config object.
Method/Property | Params | Return | Notes |
---|
getId | | string/int | |
setId | string/int | this | |
getName | | string | this |
setName | string | this | |
getConfig | | object | this |
setConfig | object | this | overwrites all config |
getConfigItem | | mixed | returns an individual item from config |
setConfigItem | string,mixed | this | sets the value of an individual item in config |
populate | object | this | sets provided values all at once (id,name,config) |
To populate with data:
The easy way: Create an object named $site with values from your server (prior to including jpack)
<script>
const $site = {
id: <?php echo $site['id']; ?>,
name: "<?php echo $site['name']; ?>",
config: JSON.parse("<?php echo json_encode($site['config']); ?>"),
};
</script>
The harder way: Perform an XHR request to grab site details via a JSON API, then run the populate method on the site object.
import {site} from '@htmlguyllc/jpack/src/objects';
$.get('/my-site-info-endpoint.php', function(data){
site.populate(JSON.parse(data));
});
To Use:
import {site} from '@htmlguyllc/jpack/src/objects';
var site_id = site.getId();
-User
Designed for sites with user accounts/guest accounts. This object stores a user's details and allows for front-end permission checks.
Method/Property | Params | Return | Notes |
---|
getId | | string/int | |
setId | string/int | this | |
getIsGuest | | bool | if your site has users who don't login but still interact and have a user record (like guest checkout) |
setIsGuest | bool | this | |
setIsAdmin | | bool | if your site has users who have ultimate permissions and you want to do something based on that |
setIsGuest | bool | this | |
getUsername | | string | |
setUsername | string | this | |
getFname | | string | |
setFname | string | this | |
getLname | | string | |
setLname | string | this | |
getName | | string | returns fname and lname concatenated with a space |
getEmail | | string | |
setEmail | string | this | |
getPhone | | string | |
setPhone | string | this | |
getPermissions | | array | |
setPermissions | array | this | |
addPermission | string/int | this | |
removePermission | string/int | this | |
hasPermission | string/int | bool | |
getAdditionalData | | object | set any additional data about this user that doesn't fit the default getters and setters here (a better idea would be to extend this object with your custom properties/methods) |
setAdditionalData | object | this | |
getDataItem | string | mixed | returns a single value from the additional data object/array |
setDataItem | string, mixed | sets a single value in the additional data array/object | |
populate | object | this | sets provided values all at once (id, isGuest, isAdmin, etc) |
To populate with data:
The easy way: Create an object named $user with values from your server (prior to including jpack)
<script>
const $user = {
id: <?php echo $user['id']; ?>,
fname: "<?php echo $user['fname']; ?>",
//..
permissions: JSON.parse("<?php echo json_encode($user['permissions']); ?>"),
additionalData: JSON.parse("<?php echo json_encode([
'user_type'=>$user['user_type'],
//whatever else you might want to pass
]); ?>"),
//..
};
</script>
The harder way: Perform an XHR request to grab site details via a JSON API, then run the populate method on the site object.
import {user} from '@htmlguyllc/jpack/src/objects';
$.get('/my-user-info-endpoint.php', function(data){
user.populate(JSON.parse(data));
});
To use:
import {site} from '@htmlguyllc/jpack/src/objects';
var site_id = site.getId();
- Plugin Wrappers -
None yet.
- Utilities -
-Strings
Common string manipulations
Method/Property | Params | Return | Notes |
---|
ucfirst | string | string | capitalizes the first letter of a string like ucfirst in PHP |
getter | string | string | creates a getter method name from a string |
setter | string | string | creates a setter method name from a string |
To Use:
import {strings} from '@htmlguyllc/jpack/src/utilities';
strings.ucfirst('bob');
strings.getter('name');
strings.setter('name');
-DOM
HTML DOM helpers
Method/Property | Params | Return | Notes |
---|
getDomElement | mixed, bool, bool | Element/HTMLDocument/null | returns a native DOM element for whatever you provide (selector string, array of elements, single element, jQuery wrapped DOM element, etc) |
getDomElements | mixed, bool | array | same as getDomElement, except it returns all matches |
remove | mixed | this | removes elements from the DOM - uses .getDomElements() |
exists | mixed | bool | checks to see if it exists in the DOM |
multipleExist | mixed | bool | checks to see if more than 1 instance exists in the DOM |
To Use:
import {dom} from '@htmlguyllc/jpack/src/utilities';
dom.getDomElement('.my-fav-button', true, true);
dom.getDomElements('.links', true);
dom.getDomElement('.my-button');
dom.getDomElements('.links');
dom.getDomElement($('a'));
dom.getDomElement(document.querySelectorAll('a'));
dom.exists('a');
dom.multipleExist('a');
-Type Checks
Check the data type of a value with more specificity than typeof or vanilla JS functions
Method/Property | Params | Return | Notes |
---|
isDataObject | object, array, bool, bool, bool | bool | validates that an object contains data and not a dom element, array, null or anything else that would normally return true when you call typeof |
To Use:
import {type_checks} from '@htmlguyllc/jpack/src/utilities';
var my_obj = {id:null, name:'John Doe', email:'john@doe.com'};
type_checks.isDataObject(my_obj, ['id', 'name', 'email'], true, true, true);
-Events
Shorthand event handlers
Method/Property | Params | Return | Notes |
---|
onClick | mixed, function | array | prevents the browser's default so you can handle link clicks and form submissions with less code |
offClick | mixed, function | array | removes the handler you added using onClick |
onSubmit | mixed, function | array | same as .onClick() but for submit |
offSubmit | mixed, function | array | same as .offClick() but for submit |
onChange | mixed, function | array | adds an on change handler but does NOT preventDefault - mostly exists for consistency |
offChange | mixed, function | array | removes the handler you added using .onChange() |
onEventPreventDefault | mixed, string, function | array | attaches an event handler and prevents the default browser action |
offEventPreventDefault | mixed, string, function | array | removes the handler you attached with .onEventPreventDefault() |
on | mixed, string, function | array | attaches an event listener |
off | mixed, string, function | array | removes an event listener |
trigger | mixed, string, mixed | array | triggers an event on an element/elements - uses .getDomElements() |
To Use:
import {events} from '@htmlguyllc/jpack/src/utilities';
events.onClick('a.my-link', function(){
});
events.onSubmit('form.my-form', function(){
});
events.trigger('.my-form', 'submit', {id:1});