@qikdev/sdk
Version:
Promise based Javascript SDK
612 lines (506 loc) • 25.3 kB
HTML
<html lang="en">
<head>
<meta charset="utf-8">
<title>qik.filter.js - Documentation</title>
<script src="scripts/prettify/prettify.js"></script>
<script src="scripts/prettify/lang-css.js"></script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc.css">
<script src="scripts/nav.js" defer></script>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<input type="checkbox" id="nav-trigger" class="nav-trigger" />
<label for="nav-trigger" class="navicon-button x">
<div class="navicon"></div>
</label>
<label for="nav-trigger" class="overlay"></label>
<nav >
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="access.html">access</a><ul class='methods'><li data-type='method'><a href="access.html#.actionableScopes">actionableScopes</a></li><li data-type='method'><a href="access.html#.allPermissions">allPermissions</a></li><li data-type='method'><a href="access.html#.allPermissionTypes">allPermissionTypes</a></li><li data-type='method'><a href="access.html#.allUserScopes">allUserScopes</a></li><li data-type='method'><a href="access.html#.canCreate">canCreate</a></li><li data-type='method'><a href="access.html#.canDeleteItem">canDeleteItem</a></li><li data-type='method'><a href="access.html#.canEditItem">canEditItem</a></li><li data-type='method'><a href="access.html#.canEraseItem">canEraseItem</a></li><li data-type='method'><a href="access.html#.canKnowOf">canKnowOf</a></li><li data-type='method'><a href="access.html#.canListItem">canListItem</a></li><li data-type='method'><a href="access.html#.canRestoreItem">canRestoreItem</a></li><li data-type='method'><a href="access.html#.canViewItem">canViewItem</a></li><li data-type='method'><a href="access.html#.checkActionAccess">checkActionAccess</a></li><li data-type='method'><a href="access.html#.getAllDescendants">getAllDescendants</a></li><li data-type='method'><a href="access.html#.has">has</a></li><li data-type='method'><a href="access.html#.hasFeature">hasFeature</a></li><li data-type='method'><a href="access.html#.hashPermissions">hashPermissions</a></li><li data-type='method'><a href="access.html#.isAdministrator">isAdministrator</a></li><li data-type='method'><a href="access.html#.isAssignee">isAssignee</a></li><li data-type='method'><a href="access.html#.isOwner">isOwner</a></li></ul></li><li><a href="api.html">api</a><ul class='methods'><li data-type='method'><a href="api.html#.generateEndpointURL">generateEndpointURL</a></li></ul></li><li><a href="auth.html">auth</a><ul class='methods'><li data-type='method'><a href="auth.html#.changeOrganisation">changeOrganisation</a></li><li data-type='method'><a href="auth.html#.ensureValidToken">ensureValidToken</a></li><li data-type='method'><a href="auth.html#.getCurrentToken">getCurrentToken</a></li><li data-type='method'><a href="auth.html#.getCurrentUser">getCurrentUser</a></li><li data-type='method'><a href="auth.html#.impersonate">impersonate</a></li><li data-type='method'><a href="auth.html#.login">login</a></li><li data-type='method'><a href="auth.html#.logout">logout</a></li><li data-type='method'><a href="auth.html#.retrieveUserFromResetToken">retrieveUserFromResetToken</a></li><li data-type='method'><a href="auth.html#.sendResetPasswordRequest">sendResetPasswordRequest</a></li><li data-type='method'><a href="auth.html#.set">set</a></li><li data-type='method'><a href="auth.html#.sync">sync</a></li><li data-type='method'><a href="auth.html#.updateUserWithToken">updateUserWithToken</a></li></ul></li><li><a href="cache.html">cache</a><ul class='methods'><li data-type='method'><a href="cache.html#.get">get</a></li><li data-type='method'><a href="cache.html#.reset">reset</a></li></ul></li><li><a href="content.html">content</a><ul class='methods'><li data-type='method'><a href="content.html#.create">create</a></li><li data-type='method'><a href="content.html#.delete">delete</a></li><li data-type='method'><a href="content.html#.get">get</a></li><li data-type='method'><a href="content.html#.getFromSlug">getFromSlug</a></li><li data-type='method'><a href="content.html#.glossary">glossary</a></li><li data-type='method'><a href="content.html#.list">list</a></li><li data-type='method'><a href="content.html#.patch">patch</a></li><li data-type='method'><a href="content.html#.restore">restore</a></li><li data-type='method'><a href="content.html#.scopeGlossary">scopeGlossary</a></li><li data-type='method'><a href="content.html#.update">update</a></li><li data-type='method'><a href="content.html#.validateField">validateField</a></li><li data-type='method'><a href="content.html#.variables">variables</a></li></ul></li><li><a href="files.html">files</a><ul class='methods'><li data-type='method'><a href="files.html#.downloadUrl">downloadUrl</a></li><li data-type='method'><a href="files.html#.duration">duration</a></li><li data-type='method'><a href="files.html#.filesize">filesize</a></li><li data-type='method'><a href="files.html#.getBinaryTypeFromMime">getBinaryTypeFromMime</a></li><li data-type='method'><a href="files.html#.mediaUrl">mediaUrl</a></li></ul></li><li><a href="filter.html">filter</a><ul class='methods'><li data-type='method'><a href="filter.html#.activeFilterComparators">activeFilterComparators</a></li><li data-type='method'><a href="filter.html#.activeFilterKeys">activeFilterKeys</a></li><li data-type='method'><a href="filter.html#.activeFilterOperators">activeFilterOperators</a></li><li data-type='method'><a href="filter.html#.activeFilters">activeFilters</a></li><li data-type='method'><a href="filter.html#.activeFilterValues">activeFilterValues</a></li><li data-type='method'><a href="filter.html#.filterChangeString">filterChangeString</a></li><li data-type='method'><a href="filter.html#.isValidFilter">isValidFilter</a></li></ul></li><li><a href="geo.html">geo</a><ul class='methods'><li data-type='method'><a href="geo.html#.distance">distance</a></li><li data-type='method'><a href="geo.html#.getDefaultCountry">getDefaultCountry</a></li><li data-type='method'><a href="geo.html#.getDefaultTimezone">getDefaultTimezone</a></li><li data-type='method'><a href="geo.html#.getPosition">getPosition</a></li><li data-type='method'><a href="geo.html#.stopWatchPosition">stopWatchPosition</a></li><li data-type='method'><a href="geo.html#.watchPosition">watchPosition</a></li></ul></li><li><a href="module-QikStorage-CookieStorageAdapter.html">CookieStorageAdapter</a><ul class='methods'><li data-type='method'><a href="module-QikStorage-CookieStorageAdapter.html#getCookieOptions">getCookieOptions</a></li><li data-type='method'><a href="module-QikStorage-CookieStorageAdapter.html#isCookieMode">isCookieMode</a></li></ul></li><li><a href="module-QikStorage-LocalStorageAdapter.html">LocalStorageAdapter</a></li><li><a href="module-QikStorage-StorageAdapter.html">StorageAdapter</a><ul class='methods'><li data-type='method'><a href="module-QikStorage-StorageAdapter.html#clearUser">clearUser</a></li><li data-type='method'><a href="module-QikStorage-StorageAdapter.html#getAccessToken">getAccessToken</a></li><li data-type='method'><a href="module-QikStorage-StorageAdapter.html#getRefreshToken">getRefreshToken</a></li><li data-type='method'><a href="module-QikStorage-StorageAdapter.html#getTokenExpiry">getTokenExpiry</a></li><li data-type='method'><a href="module-QikStorage-StorageAdapter.html#getUser">getUser</a></li><li data-type='method'><a href="module-QikStorage-StorageAdapter.html#isAvailable">isAvailable</a></li><li data-type='method'><a href="module-QikStorage-StorageAdapter.html#setUser">setUser</a></li></ul></li><li><a href="socket.html">socket</a><ul class='methods'><li data-type='method'><a href="socket.html#.channel">channel</a></li><li data-type='method'><a href="socket.html#.close">close</a></li><li data-type='method'><a href="socket.html#.connect">connect</a></li><li data-type='method'><a href="socket.html#.reconnect">reconnect</a></li><li data-type='method'><a href="socket.html#.subscribe">subscribe</a></li><li data-type='method'><a href="socket.html#.unsubscribe">unsubscribe</a></li></ul></li><li><a href="system.html">system</a><ul class='methods'><li data-type='method'><a href="system.html#.countries">countries</a></li></ul></li><li><a href="utils.html">utils</a><ul class='methods'><li data-type='method'><a href="utils.html#.cleanValue">cleanValue</a></li><li data-type='method'><a href="utils.html#.comma">comma</a></li><li data-type='method'><a href="utils.html#.errorMessage">errorMessage</a></li><li data-type='method'><a href="utils.html#.exists">exists</a></li><li data-type='method'><a href="utils.html#.extractFromArray">extractFromArray</a></li><li data-type='method'><a href="utils.html#.formatCurrency">formatCurrency</a></li><li data-type='method'><a href="utils.html#.getTypeFromID">getTypeFromID</a></li><li data-type='method'><a href="utils.html#.guid">guid</a></li><li data-type='method'><a href="utils.html#.hash">hash</a></li><li data-type='method'><a href="utils.html#.id">id</a></li><li data-type='method'><a href="utils.html#.ids">ids</a></li><li data-type='method'><a href="utils.html#.isValidEmailAddress">isValidEmailAddress</a></li><li data-type='method'><a href="utils.html#.loadExternalScript">loadExternalScript</a></li><li data-type='method'><a href="utils.html#.loadExternalStyle">loadExternalStyle</a></li><li data-type='method'><a href="utils.html#.machineName">machineName</a></li><li data-type='method'><a href="utils.html#.mapParameters">mapParameters</a></li><li data-type='method'><a href="utils.html#.matchInArray">matchInArray</a></li><li data-type='method'><a href="utils.html#.parseBoolean">parseBoolean</a></li><li data-type='method'><a href="utils.html#.parseDate">parseDate</a></li><li data-type='method'><a href="utils.html#.parseEmail">parseEmail</a></li><li data-type='method'><a href="utils.html#.parseInt">parseInt</a></li><li data-type='method'><a href="utils.html#.parseNumber">parseNumber</a></li><li data-type='method'><a href="utils.html#.parseURL">parseURL</a></li></ul></li></ul><h3>Modules</h3><ul><li><a href="module-QikStorage.html">QikStorage</a><ul class='methods'><li data-type='method'><a href="module-QikStorage.html#.createStorageAdapter">createStorageAdapter</a></li></ul></li></ul><h3>Global</h3><ul><li><a href="global.html#EventDispatcher">EventDispatcher</a></li></ul>
</nav>
<div id="main">
<h1 class="page-title">qik.filter.js</h1>
<section>
<article>
<pre class="prettyprint source linenums"><code>/**
* @name filter
* @classdesc Provides functions helpful for interacting with the filtering system
* @class
*/
///////////////////////
var service = {};
///////////////////////
function isEmpty(value) {
if (value === 0) {
return false;
}
var empty = typeof value === 'undefined' || value === null || String(value).trim() === '';
if (empty) {
return true;
}
//If it's a string of undefined or null then treat it as empty also
if (value === 'undefined' || value === 'null') {
return true;
}
return false;
}
function compactFunction(val) {
return !isEmpty(val)
}
///////////////////////
service.cleanKey = function(key) {
key = String(key).split('|')[0];
if (key[0] == '.') {
key = key.slice(1);
}
return key;
}
///////////////////////
/**
* @description Check if an object is a valid filter
* @alias filter.isValidFilter
* @param {Object} filter The filter block to check
* @example
* // Missing a 'key'
* const invalidFilter = sdk.filter.isValidFilter({comparator:'in', values:['Red', 'Green', 'Blue']})
* // returns false
*
* const validFilter = sdk.filter.isValidFilter({key:'favoriteColor', comparator:'in', values:['Red', 'Green', 'Blue']})
* // returns true
*/
service.isValidFilter = function(filter) {
if (!filter) {
return false;
}
///////////////////////////
//If the filter has nested filters consider it valid
//if it has valid child filters
if (filter.operator) {
if (!filter.filters || !filter.filters.length) {
return false;
}
return filter.filters.some(service.isValidFilter);
}
// ///////////////////////////
// //Get the comparator for the filter
// var comparator = hash[filter.comparator];
// if (!comparator) {
// //No comparator was specified for the filter
// return false;
// }
///////////////////////////
var key = service.cleanKey(filter.key);
if (!key) {
//No key has been specified for the filter
return false;
}
// if(filter.comparator.inputType === 'none') {
// console.log('COMPARATOR IS EMPTY')
// return true;
// }
switch (filter.comparator) {
case 'empty':
case 'notempty':
case 'datetoday':
case 'datenottoday':
case 'datebeforetoday':
case 'dateaftertoday':
case 'dateweektoday':
case 'datemonthtoday':
case 'datebeforenow':
case 'dateafternow':
case 'datethisweek':
case 'datethismonth':
return true;
break;
}
var multiValues = (filter.values || []).filter(compactFunction);
return !isEmpty(filter.value) || !isEmpty(filter.value2) || multiValues.length;
// ///////////////////////////
// switch (filter.inputType) {
// case 'none':
// //If we are checking empty/notempty
// //the filter is always valid without any extra parameters
// return true;
// break;
// case 'range':
// //If we are filtering a number range
// //we need the start and end of the range
// if (!filter.value || isNaN(filter.value)) {
// return false;
// }
// if (!filter.value2 || isNaN(filter.value2)) {
// return false;
// }
// break;
// case 'daterange':
// if (!filter.value || !parseDate(filter.value)) {
// return false;
// }
// if (!filter.value2 || !parseDate(filter.value2)) {
// return false;
// }
// break;
// case 'array':
// if (!filter.values || !filter.values.length) {
// return false;
// }
// break;
// default:
// // if (filter.dataType == 'boolean') {
// // //Check if they provided a valid boolean value to the filter
// // return validBooleans[String(filter.value).toLowerCase()];
// // } else {
// // //The filter has not been provided with a value
// if (isEmpty(filter.value)) {
// return false;
// }
// // }
// break;
// }
///////////////////////////
//If we got this far then the information
//provided to the filter is enough to run it
return true;
}
////////////////////////////////////////////////
/**
*
* @description Returns an array of all active filters
* @alias filter.activeFilters
* @param {Object} filterConfiguration A filter configuration object
* @example
*
* const filterConfiguration = {
* "operator": "and",
* "filters": [
* {
* "operator": "and",
* "filters": [
* {
* "key": "formData.person.firstName",
* "comparator": "startswith",
* "value": "c"
* },
* {
* "key": "invalid no comparator",
* "value": "e"
* }
* {
* "key": "formData.person.lastName",
* "comparator": "endswith",
* "value": "e"
* }
* ]
* }
* ]
* }
*
* const activeFilters = sdk.filter.activeFilters(filterConfiguration);
*
* const returns = [
* {
* "key": "formData.person.firstName",
* "comparator": "startswith",
* "value": "c"
* },
* {
* "key": "formData.person.lastName",
* "comparator": "endswith",
* "value": "e"
* }]
*
*/
service.activeFilters = function(filterConfiguration) {
var memo = [];
retrieveActiveFilter(filterConfiguration, memo);
return memo;
////////////////////////////
function retrieveActiveFilter(filterBlock, memo) {
if (!filterBlock) {
return;
}
var isValid = service.isValidFilter(filterBlock);
if (isValid) {
memo.push(filterBlock);
}
if (filterBlock.filters && filterBlock.filters.length) {
filterBlock.filters.forEach(function(b) {
retrieveActiveFilter(b, memo);
})
}
}
}
////////////////////////////////////////////////
/**
*
* @description Returns an array of all keys that are being actively filtered on
* @alias filter.activeFilterKeys
* @param {Object} filterConfiguration A filter configuration object
* @example
*
* const filterConfiguration = {
* "operator": "and",
* "filters": [
* {
* "operator": "and",
* "filters": [
* {
* "key": "formData.person.firstName",
* "comparator": "startswith",
* "value": "c"
* },
* {
* "key": "invalid no comparator",
* "value": "e"
* }
* {
* "key": "formData.person.lastName",
* "comparator": "endswith",
* "value": "e"
* }
* ]
* }
* ]
* }
*
* const activeFilters = sdk.filter.activeFilterKeys(filterConfiguration);
* // Returns ['formData.person.firstName', 'formData.person.lastName']
*
*/
service.activeFilterKeys = function(filterConfiguration, options) {
options = options || {}
var activeFilters = service.activeFilters(filterConfiguration);
var value = activeFilters
.filter(function(entry) {
//Ignore all the wrapping entries
return !entry.operator;
})
.reduce(function(set, filter) {
var rootKey = service.cleanKey(filter.key);
if (options.trimArrayDelimeters !== false) {
rootKey = rootKey.split('[]').join('');
}
set[rootKey] = true;
return set;
}, {});
var keys = Object.keys(value);
return keys;
};
/**
*
* @description Returns an array of all comparators that are being actively filtered
* @alias filter.activeFilterComparators
* @param {Object} filterConfiguration A filter configuration object
* @example
*
* const filterConfiguration = {
* "operator": "and",
* "filters": [
* {
* "operator": "and",
* "filters": [
* {
* "key": "formData.person.firstName",
* "comparator": "startswith",
* "value": "c"
* },
* {
* "key": "invalid no comparator",
* "value": "e"
* }
* {
* "key": "formData.person.lastName",
* "comparator": "endswith",
* "value": "e"
* }
* ]
* }
* ]
* }
*
* const activeFilters = sdk.filter.activeFilterKeys(filterConfiguration);
* // Returns ['startswith', 'endswith']
*
*/
service.activeFilterComparators = function(filterConfiguration) {
var comparators = service.activeFilters(filterConfiguration)
.filter(function(entry) {
//Ignore all the wrapping entries
return !entry.operator;
})
.reduce(function(set, filter) {
set[filter.comparator] = true;
return set;
}, {})
return Object.keys(comparators);
}
/**
*
* @description Returns an array of all comparators that are being actively filtered
* @alias filter.activeFilterOperators
* @param {Object} filterConfiguration A filter configuration object
* @example
*
* const filterConfiguration = {
* "operator": "and",
* "filters": [
* {
* "operator": "nor",
* "filters": [
* {
* "key": "formData.person.firstName",
* "comparator": "startswith",
* "value": "c"
* },
* {
* "key": "invalid no comparator",
* "value": "e"
* }
* {
* "key": "formData.person.lastName",
* "comparator": "endswith",
* "value": "e"
* }
* ]
* }
* ]
* }
*
* const activeFilterOperators = sdk.filter.activeFilterOperators(filterConfiguration);
* // Returns ['and', 'nor']
*
*/
service.activeFilterOperators = function(filterConfiguration) {
var operators = service.activeFilters(filterConfiguration)
.filter(function(entry) {
return entry.operator;
})
.reduce(function(set, filter) {
set[filter.operator] = true;
return set;
}, {})
return Object.keys(operators);
}
/**
*
* @description Returns an array of all values that are being actively used by a filter
* @alias filter.activeFilterValues
* @param {Object} filterConfiguration A filter configuration object
* @example
*
* const filterConfiguration = {
* "operator": "and",
* "filters": [
* {
* "operator": "nor",
* "filters": [
* {
* "key": "formData.person.firstName",
* "comparator": "startswith",
* "value": "c"
* },
* {
* "key": "invalid no comparator",
* "value": "e"
* }
* {
* "key": "formData.person.lastName",
* "comparator": "endswith",
* "value": "a"
* }
* ]
* }
* ]
* }
*
* const activeFilterValues = sdk.filter.activeFilterValues(filterConfiguration);
* // Returns ['c', 'a']
*
*/
service.activeFilterValues = function(filterConfiguration, options) {
options = options || {};
var activeFilters = service.activeFilters(filterConfiguration);
function mapValue(v) {
if (!v) {
return;
}
return v._id || v.id || v.title || v.name || v;
}
var values = activeFilters
.filter(function(entry) {
//Ignore all the wrapping entries
return !entry.operator;
})
.reduce(function(set, filter) {
set = [...set, ...(filter.values || []).map(mapValue), mapValue(filter.value), mapValue(filter.value2)];
return set;
}, [])
.filter(compactFunction);
return values;
}
/**
*
* @description Returns an string representation of a filter configuration.
* Often used to check if a user has changed the filter in any way, the string only takes into consideration active valid filters
* @alias filter.filterChangeString
* @param {Object} filterConfiguration A filter configuration object
* @example
*
* const filterConfiguration = {
* "operator": "and",
* "filters": [
* {
* "operator": "nor",
* "filters": [
* {
* "key": "formData.person.firstName",
* "comparator": "startswith",
* "value": "c"
* },
* {
* "key": "invalid no comparator",
* "value": "e"
* }
* {
* "key": "formData.person.lastName",
* "comparator": "endswith",
* "value": "a"
* }
* ]
* }
* ]
* }
*
* // Watch this string for changes
* const changeString = sdk.filter.filterChangeString(filterConfiguration);
*/
service.filterChangeString = function(config) {
var activeFilters = service.activeFilters(config);
return JSON.stringify(activeFilters);
// const string = [
// service.activeFilterKeys(config).join(', '),
// service.activeFilterValues(config).join(', '),
// service.activeFilterComparators(config).join(', '),
// service.activeFilterOperators(config).join(', '),
// ]
// return string.filter(compactFunction).join(', ');
};
///////////////////////
export default service;</code></pre>
</article>
</section>
</div>
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a> on Mon Jul 13 2026 18:49:48 GMT+1000 (Australian Eastern Standard Time) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
</footer>
<script>prettyPrint();</script>
<script src="scripts/polyfill.js"></script>
<script src="scripts/linenumber.js"></script>
</body>
</html>