chromawoods / instaFilta

jQuery plugin for performing in-page filtering
MIT License
42 stars 12 forks source link

instaFilta

instaFilta does in-page filtering and has absolutely nothing to do with Instagram.

Imagine that you have a web page displaying a huge list of data. It might be hard for the user to scan through all that data to find the thing he/she is interested in. instaFilta is a jQuery plugin that uses the input of a text field to perform in-page filtering, hiding non-matching items as the user types. Optionally, it can also filter out complete sections (groups of items) if there are no matching items in that section. If you don't use sections, you don't need to do anything special, it will work fine without specifying so.

Live demo

http://chromawoods.com/instafilta/demo/

General usage

Call instaFilta on the text field that should be observed, passing any of the options in an object. In the below example, we have specified that we only want to match items that begin with whatever the user types in the text field.

$('#username-filtering').instaFilta({
    targets: '.username',
    beginsWith: true
});

Options

Option Type Descriptions Default value
scope jQuery selector string Selector of an element in which the input field and the targets are enclosed. Use this if you want to use multiple filter sections on your page null
targets jQuery selector string Classname of an individual item. '.instafilta-target'
sections jQuery selector string Classname of the sections holding the items. '.instafilta-section'
categoryDataAttr string Name of data attributes in which to look for categories. (read more below) 'instafilta-category'
matchCssClass string Classname of the spans indicating matching text. 'instafilta-match'
itemsHideEffect string What jQuery effect to use for hiding items (slideUp etc.). 'hide'
itemsHideDuration integer Duration (in ms) of item hide effect. 0
itemsShowEffect string What jQuery effect to use for showing items (slideDown etc.). 'show'
itemsShowDuration integer Duration (in ms) of item show effect. 0
sectionsHideEffect string What jQuery effect to use for hiding sections (slideUp etc.). 'hide'
sectionsHideDuration integer Duration (in ms) of section hide effect. 0
sectionsShowEffect string What jQuery effect to use for showing sections (slideDown etc.). 'show'
sectionsShowDuration integer Duration (in ms) of section show effect. 0
onFilterComplete function Callback which is fired when the filtering process is complete. Recieves matchedItems, which is jQuery containing all matched items. null
markMatches boolean If true, matching text will get wrapped by a span having the class name of whatever the matchCssClass option is set to. false
hideEmptySections boolean If using sections, this option decides whether to hide sections which did not have any matching items in them. true
beginsWith boolean We can choose to match the beginning of an item's text, or anywhere within. false
caseSensitive boolean Whether to ignore character casing. false
typeDelay integer The filtering process takes place on the keyUp event. If you have a large list of items to process, you might want to set a higher value (in milliseconds) to prevent the filtering to be able to occur so frequently. So in other words, it would kind of "wait" a bit while the user types. 0
useSynonyms boolean When set to true, this option will also match user input against a synonym list. true
synonyms object array List of objects that contain synonyms. See section below. Common accents, see below.

Methods

filterTerm

Can be used to programmatically apply a filter. For normal simple usage, you will probably not be needing this.

Returns

Matched elements (jQuery)

Parameters

Parameters Description Type Default value
term What search string to filter on. string undefined (will show all targets)

filterCategory

Can be used to filter on one or more categories. See demo page for live examples.

Returns

Matched elements (jQuery)

Parameters

Parameters Description Type Default value
categories One or more categories to use. string, comma separated string or array of strings undefined (will show all targets)
requireAll If true, ALL categories must match each item, rather than any. boolean false

Highlighting matching text

When filtering out list items, it might be valuable to highlight exactly what part of the text was matched. We can do this using the markMatches option. If set to true, the match will get wrapped by a span, having the matchCssClass option CSS class (which defaults to instafilta-match). Use this class to style the match within the item text.

Note: If you use this feature, you might encounter incorrect highlighting if you are using synonyms that are more than one character.

Synonyms

You can use synonyms to allow several characters or even words to match one single user input. This is helpful for accent letters but it can also be used for whole words, like aliases. Synonyms are used by default and the synonym list contains the following:

[
    { src: 'à,á,å,ä,â,ã', dst: 'a' },
    { src: 'À,Á,Å,Ä,Â,Ã', dst: 'A' },
    { src: 'è,é,ë,ê', dst: 'e' },
    { src: 'È,É,Ë,Ê', dst: 'E' },
    { src: 'ì,í,ï,î', dst: 'i' },
    { src: 'Ì,Í,Ï,Î', dst: 'I' },
    { src: 'ò,ó,ö,ô,õ', dst: 'o' },
    { src: 'Ò,Ó,Ö,Ô,Õ', dst: 'O' },
    { src: 'ù,ú,ü,û', dst: 'u' },
    { src: 'Ù,Ú,Ü,Û', dst: 'U' },
    { src: 'ç', dst: 'c' },
    { src: 'Ç', dst: 'C' },
    { src: 'æ', dst: 'ae' }
]

src contains a list of characters or words that should match dst, other than the input itself of course. As an example, if the user has typed Therese, it will match both Therese and Thérèse.

Categories

By appending a data-attribute named according to setting categoryDataAttr, it is possible to "label" or "tag" items. Use the filterCategory method to apply the category filter. You would typically use this together with some form element like a select or checkbox. Target items can belong to multiple categories, just separate them with a comma. The category parameter passed to filterCategory can also contain several comma separated categories.

<li class="instafilta-target" data-instafilta-category="human">John Connor</li>
<li class="instafilta-target" data-instafilta-category="machine">Terminator</li>
<li class="instafilta-target" data-instafilta-category="human,machine,both">RoboCop</li>
var insta = $('#some-input').instaFilta();

/* This will show "John Connor" and "RoboCop" */
insta.filterCategory('human');

/* This will show "Terminator" and "RoboCop" */
insta.filterCategory('machine');

/* This will show only "RoboCop" */
insta.filterCategory('both');

Multiple Filter Usage

If you have want to use instaFilta on more than one text input, you must supply instaFilta with a scope element selector. The scope element must enclose both the text input field and the targets it should filter.

$('#username-filtering').instaFilta({
    scope: '.container-div',
    targets: '.username',
    beginsWith: true
});