list.js-1.1.1/ 0000775 0000000 0000000 00000000000 12313007001 0013063 5 ustar 00root root 0000000 0000000 list.js-1.1.1/.gitignore 0000664 0000000 0000000 00000000055 12313007001 0015053 0 ustar 00root root 0000000 0000000 .DS_Store
lab/
components
build
node_modules
list.js-1.1.1/Gruntfile.js 0000664 0000000 0000000 00000004330 12313007001 0015360 0 ustar 00root root 0000000 0000000 module.exports = function(grunt) {
"use strict";
grunt.initConfig({
pkg: require("./package.json"),
watch: {
scripts: {
files: ['{,*/}*.js', '*.js', 'test/*.html', 'test/*.js'],
tasks: ['default'],
options: {
spawn: false,
},
},
},
shell: {
install: {
command: 'component install --dev',
options: {
stderr: true
}
},
build: {
command: 'component build --dev',
options: {
stderr: true
}
},
standalone: {
command: 'component build --standalone List -n list.standalone'
},
mkdir: {
command: 'mkdir -p dist'
},
move: {
command: 'mv build/list.standalone.js dist/list.js'
},
remove: {
command: 'rm -fr build components dist'
}
},
jshint: {
code: {
src: ['Gruntfile.js', '*.js', 'src/*.js'],
options: {
expr: true,
multistr: false,
globals: {
module: true
}
}
},
tests: {
src: ['test/(*|!mocha).js'],
options: {
expr: true,
multistr: true,
globals: {
jQuery: true,
module: true
}
}
}
},
uglify: {
target: {
files: {
'dist/list.min.js': ['dist/list.js']
}
}
},
mocha: {
cool: {
src: [ 'test/index.html' ],
options: {
run: true,
timeout: 10000,
bail: false,
log: true,
reporter: 'Nyan',
mocha: {
ignoreLeaks: false
}
}
}
}
});
grunt.loadNpmTasks("grunt-contrib-watch");
grunt.loadNpmTasks('grunt-shell');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-mocha');
grunt.registerTask('default', ['jshint:code', 'jshint:tests', 'shell:install', 'shell:build']);
grunt.registerTask('dist', ['default', 'shell:standalone', 'shell:mkdir', 'shell:move', 'uglify']);
grunt.registerTask('clean', ['shell:remove']);
grunt.registerTask('test', ['mocha']);
return grunt;
};
list.js-1.1.1/History.md 0000664 0000000 0000000 00000011604 12313007001 0015050 0 ustar 00root root 0000000 0000000 # Changelog
### 2014-02-03: 1.1.1
- *[Bugfix]* Update `javve/events` version which fixes critical bugs in Safari for PC and PhantomJS (which makes the command line tests work again).
- *[Bugfix]* Clear search when clicking in the HTML5 clear button.
- *[Misc]* Add History.md file for changelog instead of having it at Listjs.com.
### 2014-02-03: 1.1.0
- *[Change]* The sorting API is update so it looks like this `listObj.sort('name', { order: "asc "})` and `listObj.sort('name', { order: "desc "})` instead or `listObj.sort('name', { desc: true/false })`.
- *[Feature]* Added support for default sort function `new List('id', { sortFunction: function(itemA, itemB) { .. }})
- *[Feature]* Adding `data-order="asc/desc"` to a sort button makes that button only sort `asc` or `desc`, ie no to
- *[Bugfix]* Fix `grunt watch` bug.
- *[Bugfix]* Remove sorting when searching and filtering.
- *[Bugfix]* Fix sorting and search when using pagiation plugin
### 2014-01-17: 1.0.2
- *[Bugfix]* Fix error that broke the lib in IE8.
### 2013-11-12: 1.0.0
- *[Feature]* Add more events and enable to add them on initialization.
- *[Feature]* Add support for Component.js, Bower, RequireJS and CommonJS
- *[Feature]* Make it possible to remove event handlers by `.off('event', handler)`
- *[Improvement]* Many new tests
- *[Improvement]* Paging plugin default classes and structure now correspons to Twitter Bootstraps pagination.
- *[Improvement]* Make sorting case-insensitive (thanks @thomasklemm)
- *[Improvement]* Add item._values for direct access to a items values. Simplifies debugging. Note: Always use item.values() when interacting with the values.
- *[Bugfix]* `.add(items, callbak)` with `callback` set does no longer add an extra item.
- *[Bugfix]* `templater.set()` no longer is called twice in a `templater.get()` call.
- *[Bugfix]* Fix error when trying to sort `undefined,null,etc` values.
- *[Bugfix]* Fix error when trying to search `undefined,null,etc` values.
- *[Bugfix]* Fix issue #51, problems with filters/search + paging.
- *[Misc]* Almost completely rewritten codebase and started using Component
- *[Misc]* Moved the website into another repo called list-website
- *[Misc]* Add documentation for searching in specific columns.
- *[Change]* `listObj.get('valueName', value)` does now always returns an array. Previously it return an object if only one item matched and null if no match was found.
- *[Change]* The default sort order is now `asc` instead of `desc`.
- *[Change]* Syntax for searching in specific columns are now `.search('val', [ 'columnName', 'columnName2' ])` instead of `.search('val', { columnName: true, columnName2: true })`.
- *[Change]* Move plugins into seperated repos: github.com/javve/list.pagination.js and github.com/javve/list.fuzzysearch.js
- *[Change]* Plugin initiation have changed. See getting started with plugins
### 2012-04-24: 0.2.1
- Fuzzy Search plugin, `.filter()` changes and bug fixes *[Read more »](http://jonnystromberg.com/listjs-0-2-1-release-notes/)*
### 2012-01-23: 0.2.0
- Lots of updates and interesting features. *[Read more »](http://jonnystromberg.com/listjs-0-2-0-plugins-paging/)*
### 2011-12-15: 0.1.4
- `.filters()`, `.sort()` and `.search()` now deped on each other. If the list is filtered and then there is a search, the items hidden by the filters will stay hidden etc.
- `.filter()` is the only way to reset filter. `.filter(false)` does not work anymore.
### 2011-11-29: 0.1.3 release
- Added function `.clear()` that removes all items from the list
- Changed the sort function to be based on `data-sort` instead of `rel`
- When sorting one category, all sort-related classes will be removed from the other sort buttons
- Updated `.sort(valueName, sortFunction)` to `.sort(valueName, options)`, se more info in the documentation
### 2011-11-16: 0.1.2 release
- Sorting is now indicated by class `asc` or `desc` at sorting buttons
- Added three new small helper functions `hasClass(element, class)`, `addClass(element, class)
and `removeClass(element, class)`
### 2011-10-20: 0.1.1 release
- Added possibility to reverse sort the list
### 2011-10-18: 0.1 release
- Examples at Listjs.com works in IE7,8,9 (IE6 is not tested, should work)
- More documentation
- Misc bug fixes
### 2011-10-15 Final alpha 0.3 release
- More documentation
- Only show 200 items at same time, huge speed increase
- Misc bug fixes
### 2011-08-08 Alpha 0.2 release
- Added asynchronous item adding
- Added asynchronous list indexing
- Improved (but incomplete) documentation
- Bugfixes and improved helper functions
- Show helper functions non-minified
### 2011-07-25 Alpha 0.1 release
list.js-1.1.1/README.md 0000664 0000000 0000000 00000010527 12313007001 0014347 0 ustar 00root root 0000000 0000000 # List.js
Perfect library for adding **search**, **sort**, **filters** and **flexibility** to
**tables**, **lists** and various HTML elements. Built to be invisible and work on existing HTML.
Really simple and easy to use!
[](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=M7ZGHV75VSD2E)
### Core idea
- Simple and invisible
- Easy to apply to existing HTML
- No dependencies
- Fast
- Small
- Handle thousands of items
### Features
- Works both lists, tables and almost anything else. E.g. ``,`
`,``, etc.
- Search [Read more ›](http://listjs.com/docs/list-api#search)
- Sort [Read more ›](http://listjs.com/docs/list-api#sort)
- Filter [Read more ›](http://listjs.com/docs/list-api#filter)
- Simple templating system that adds possibility to add, edit, remove items [Read more ›](http://listjs.com/docs/list-api#add)
- Plugins [Read more ›](http://listjs.com/docs/plugins)
- Support for Chrome, Safari, Firefox, IE6+
### Demo / Examples
- [Existing list](http://listjs.com/examples/existing-list)
- [Existing list + add](http://listjs.com/examples/existing-list-add)
- [New list](http://listjs.com/examples/new-list)
- [Add, get, remove](http://listjs.com/examples/add-get-remove)
- [Fuzzy search](http://listjs.com/examples/fuzzy-search)
- [Pagination](http://listjs.com/examples/pagination)
## Documentation
- [Getting started](http://listjs.com/docs)
- [Options](http://listjs.com/docs/options)
- [List API](http://listjs.com/docs/list-api)
- [Item API](http://listjs.com/docs/item-api)
- [Changelog](http://listjs.com/overview/changelog)
### Plugins
- [Introduction](http://listjs.com/docs/plugins)
- [Pagination](http://listjs.com/docs/plugins/pagination)
- [Fuzzy search](http://listjs.com/docs/plugins/fuzzysearch)
- [Build your own](http://listjs.com/docs/plugins/build)
### Known issues
- Sorting fails with some UTF8 characters. Example: `åä`, thinking that `ä` is before `å`.
- Tables row items can't be created with the `{ item: '' }`-method.
## Contributors
* [javve](https://github.com/javve) / [Jonny Strömberg](http://jonnystromberg.com)
* [lusentis](https://github.com/lusentis) / [Simone Lusenti](http://www.plasticpanda.com)
* [dancrew32](https://github.com/dancrew32) / [Dan Masquelier](http://danmasq.com)
* [himynameisjonas](https://github.com/himynameisjonas) / [Jonas Forsberg](http://jonasforsberg.se)
* [LuukvE](https://github.com/LuukvE) [Luuk van Egeraat](http://luukvanegeraat.com/)
* [endorama](https://github.com/endorama) / Edoardo Tenani
* [sprynmr](https://github.com/sprynmr) / Bob Spryn
* [francescolaffi](https://github.com/francescolaffi)
* [ryantanner](https://github.com/ryantanner)
* [idlefella](https://github.com/idlefella)
* [julienbechade](https://github.com/julienbechade) / [Julien Béchade/](http://julienbechade.com/)
* [matthewheston](https://github.com/matthewheston)
* [gvido](https://github.com/gvido) / Gvido Glazers
* [karlwestin](https://github.com/karlwestin) / [Karl Westin](http://karlwestin.com)
* [joakin](https://github.com/joakin) / [Joaquin](http://chimeces.com/)
* [dancrew32](https://github.com/dancrew32) / [Dan Masquelier](http://danmasq.com/)
* [jkeyes](https://github.com/jkeyes) / [John Keyes](http://keyes.ie/)
* [samosad](https://github.com/samosad) / Alexey Tabakman
* [Page-](https://github.com/Page-)
Built with [Component](https://github.com/component/component) which is created by [TJ Holowaychuk](https://github.com/visionmedia).
### Want to contribute?
- Read more at [listjs.com/overview/contribute](http://listjs.com/overview/contribute)
### Creator
| | Jonny Strömberg [@javve](http://twitter.com/javve) |
| ------------- | ------------- |
|  | I hope you like the lib. I’ve put a lot of hours into it! Feel free to follow me on [Twitter](http://twitter.com/javve) for news and [donate a coffee](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=M7ZGHV75VSD2E) for good karma ;)
## License (MIT)
Copyright (c) 2012 Jonny Strömberg <[jonny.stromberg@gmail.com](jonny.stromberg@gmail.com)>
[http://jonnystromberg.com](http://jonnystromberg.com)
[](https://sourcegraph.com/github.com/javve/list.js)
list.js-1.1.1/bower.json 0000664 0000000 0000000 00000001035 12313007001 0015073 0 ustar 00root root 0000000 0000000 {
"name": "list.js",
"main": "dist/list.js",
"version": "1.1.1",
"homepage": "http://listjs.com",
"authors": [
"Jonny Strömberg "
],
"description": "Add search, sort and flexibility to plain HTML lists or tables with cross-browser native JavaScript.",
"keywords": [
"list",
"search",
"sort",
"table",
"dom",
"html",
"ui"
],
"license": "MIT",
"ignore": [
"**/.*",
"node_modules",
"bower_components",
"components",
"test",
"tests"
]
}
list.js-1.1.1/component.json 0000664 0000000 0000000 00000001662 12313007001 0015765 0 ustar 00root root 0000000 0000000 {
"name": "list.js",
"repo": "javve/list.js",
"version": "1.1.1",
"description": "Add search, sort and flexibility to plain HTML lists or tables with cross-browser native JavaScript.",
"keywords": [
"list",
"search",
"sort",
"table",
"dom",
"html",
"ui"
],
"scripts": [
"index.js",
"src/search.js",
"src/sort.js",
"src/item.js",
"src/templater.js",
"src/filter.js",
"src/add-async.js",
"src/parse.js"
],
"license": "MIT",
"dependencies": {
"component/classes": "*",
"segmentio/extend": "*",
"component/indexof": "*",
"javve/events": "*",
"javve/get-by-class": "*",
"javve/get-attribute": "*",
"javve/natural-sort": "*",
"javve/to-string": "*",
"component/type": "*"
},
"development": {
"visionmedia/mocha": "*",
"techjacker/expect.js": "*",
"component/jquery": "1.9.1"
},
"twitter": "javve",
"remotes": []
}
list.js-1.1.1/dist/ 0000775 0000000 0000000 00000000000 12313007001 0014026 5 ustar 00root root 0000000 0000000 list.js-1.1.1/dist/list.js 0000664 0000000 0000000 00000117075 12313007001 0015352 0 ustar 00root root 0000000 0000000 ;(function(){
/**
* Require the given path.
*
* @param {String} path
* @return {Object} exports
* @api public
*/
function require(path, parent, orig) {
var resolved = require.resolve(path);
// lookup failed
if (null == resolved) {
orig = orig || path;
parent = parent || 'root';
var err = new Error('Failed to require "' + orig + '" from "' + parent + '"');
err.path = orig;
err.parent = parent;
err.require = true;
throw err;
}
var module = require.modules[resolved];
// perform real require()
// by invoking the module's
// registered function
if (!module._resolving && !module.exports) {
var mod = {};
mod.exports = {};
mod.client = mod.component = true;
module._resolving = true;
module.call(this, mod.exports, require.relative(resolved), mod);
delete module._resolving;
module.exports = mod.exports;
}
return module.exports;
}
/**
* Registered modules.
*/
require.modules = {};
/**
* Registered aliases.
*/
require.aliases = {};
/**
* Resolve `path`.
*
* Lookup:
*
* - PATH/index.js
* - PATH.js
* - PATH
*
* @param {String} path
* @return {String} path or null
* @api private
*/
require.resolve = function(path) {
if (path.charAt(0) === '/') path = path.slice(1);
var paths = [
path,
path + '.js',
path + '.json',
path + '/index.js',
path + '/index.json'
];
for (var i = 0; i < paths.length; i++) {
var path = paths[i];
if (require.modules.hasOwnProperty(path)) return path;
if (require.aliases.hasOwnProperty(path)) return require.aliases[path];
}
};
/**
* Normalize `path` relative to the current path.
*
* @param {String} curr
* @param {String} path
* @return {String}
* @api private
*/
require.normalize = function(curr, path) {
var segs = [];
if ('.' != path.charAt(0)) return path;
curr = curr.split('/');
path = path.split('/');
for (var i = 0; i < path.length; ++i) {
if ('..' == path[i]) {
curr.pop();
} else if ('.' != path[i] && '' != path[i]) {
segs.push(path[i]);
}
}
return curr.concat(segs).join('/');
};
/**
* Register module at `path` with callback `definition`.
*
* @param {String} path
* @param {Function} definition
* @api private
*/
require.register = function(path, definition) {
require.modules[path] = definition;
};
/**
* Alias a module definition.
*
* @param {String} from
* @param {String} to
* @api private
*/
require.alias = function(from, to) {
if (!require.modules.hasOwnProperty(from)) {
throw new Error('Failed to alias "' + from + '", it does not exist');
}
require.aliases[to] = from;
};
/**
* Return a require function relative to the `parent` path.
*
* @param {String} parent
* @return {Function}
* @api private
*/
require.relative = function(parent) {
var p = require.normalize(parent, '..');
/**
* lastIndexOf helper.
*/
function lastIndexOf(arr, obj) {
var i = arr.length;
while (i--) {
if (arr[i] === obj) return i;
}
return -1;
}
/**
* The relative require() itself.
*/
function localRequire(path) {
var resolved = localRequire.resolve(path);
return require(resolved, parent, path);
}
/**
* Resolve relative to the parent.
*/
localRequire.resolve = function(path) {
var c = path.charAt(0);
if ('/' == c) return path.slice(1);
if ('.' == c) return require.normalize(p, path);
// resolve deps by returning
// the dep in the nearest "deps"
// directory
var segs = parent.split('/');
var i = lastIndexOf(segs, 'deps') + 1;
if (!i) i = 0;
path = segs.slice(0, i + 1).join('/') + '/deps/' + path;
return path;
};
/**
* Check if module is defined at `path`.
*/
localRequire.exists = function(path) {
return require.modules.hasOwnProperty(localRequire.resolve(path));
};
return localRequire;
};
require.register("component-classes/index.js", function(exports, require, module){
/**
* Module dependencies.
*/
var index = require('indexof');
/**
* Whitespace regexp.
*/
var re = /\s+/;
/**
* toString reference.
*/
var toString = Object.prototype.toString;
/**
* Wrap `el` in a `ClassList`.
*
* @param {Element} el
* @return {ClassList}
* @api public
*/
module.exports = function(el){
return new ClassList(el);
};
/**
* Initialize a new ClassList for `el`.
*
* @param {Element} el
* @api private
*/
function ClassList(el) {
if (!el) throw new Error('A DOM element reference is required');
this.el = el;
this.list = el.classList;
}
/**
* Add class `name` if not already present.
*
* @param {String} name
* @return {ClassList}
* @api public
*/
ClassList.prototype.add = function(name){
// classList
if (this.list) {
this.list.add(name);
return this;
}
// fallback
var arr = this.array();
var i = index(arr, name);
if (!~i) arr.push(name);
this.el.className = arr.join(' ');
return this;
};
/**
* Remove class `name` when present, or
* pass a regular expression to remove
* any which match.
*
* @param {String|RegExp} name
* @return {ClassList}
* @api public
*/
ClassList.prototype.remove = function(name){
if ('[object RegExp]' == toString.call(name)) {
return this.removeMatching(name);
}
// classList
if (this.list) {
this.list.remove(name);
return this;
}
// fallback
var arr = this.array();
var i = index(arr, name);
if (~i) arr.splice(i, 1);
this.el.className = arr.join(' ');
return this;
};
/**
* Remove all classes matching `re`.
*
* @param {RegExp} re
* @return {ClassList}
* @api private
*/
ClassList.prototype.removeMatching = function(re){
var arr = this.array();
for (var i = 0; i < arr.length; i++) {
if (re.test(arr[i])) {
this.remove(arr[i]);
}
}
return this;
};
/**
* Toggle class `name`, can force state via `force`.
*
* For browsers that support classList, but do not support `force` yet,
* the mistake will be detected and corrected.
*
* @param {String} name
* @param {Boolean} force
* @return {ClassList}
* @api public
*/
ClassList.prototype.toggle = function(name, force){
// classList
if (this.list) {
if ("undefined" !== typeof force) {
if (force !== this.list.toggle(name, force)) {
this.list.toggle(name); // toggle again to correct
}
} else {
this.list.toggle(name);
}
return this;
}
// fallback
if ("undefined" !== typeof force) {
if (!force) {
this.remove(name);
} else {
this.add(name);
}
} else {
if (this.has(name)) {
this.remove(name);
} else {
this.add(name);
}
}
return this;
};
/**
* Return an array of classes.
*
* @return {Array}
* @api public
*/
ClassList.prototype.array = function(){
var str = this.el.className.replace(/^\s+|\s+$/g, '');
var arr = str.split(re);
if ('' === arr[0]) arr.shift();
return arr;
};
/**
* Check if class `name` is present.
*
* @param {String} name
* @return {ClassList}
* @api public
*/
ClassList.prototype.has =
ClassList.prototype.contains = function(name){
return this.list
? this.list.contains(name)
: !! ~index(this.array(), name);
};
});
require.register("segmentio-extend/index.js", function(exports, require, module){
module.exports = function extend (object) {
// Takes an unlimited number of extenders.
var args = Array.prototype.slice.call(arguments, 1);
// For each extender, copy their properties on our object.
for (var i = 0, source; source = args[i]; i++) {
if (!source) continue;
for (var property in source) {
object[property] = source[property];
}
}
return object;
};
});
require.register("component-indexof/index.js", function(exports, require, module){
module.exports = function(arr, obj){
if (arr.indexOf) return arr.indexOf(obj);
for (var i = 0; i < arr.length; ++i) {
if (arr[i] === obj) return i;
}
return -1;
};
});
require.register("component-event/index.js", function(exports, require, module){
var bind = window.addEventListener ? 'addEventListener' : 'attachEvent',
unbind = window.removeEventListener ? 'removeEventListener' : 'detachEvent',
prefix = bind !== 'addEventListener' ? 'on' : '';
/**
* Bind `el` event `type` to `fn`.
*
* @param {Element} el
* @param {String} type
* @param {Function} fn
* @param {Boolean} capture
* @return {Function}
* @api public
*/
exports.bind = function(el, type, fn, capture){
el[bind](prefix + type, fn, capture || false);
return fn;
};
/**
* Unbind `el` event `type`'s callback `fn`.
*
* @param {Element} el
* @param {String} type
* @param {Function} fn
* @param {Boolean} capture
* @return {Function}
* @api public
*/
exports.unbind = function(el, type, fn, capture){
el[unbind](prefix + type, fn, capture || false);
return fn;
};
});
require.register("timoxley-to-array/index.js", function(exports, require, module){
/**
* Convert an array-like object into an `Array`.
* If `collection` is already an `Array`, then will return a clone of `collection`.
*
* @param {Array | Mixed} collection An `Array` or array-like object to convert e.g. `arguments` or `NodeList`
* @return {Array} Naive conversion of `collection` to a new `Array`.
* @api public
*/
module.exports = function toArray(collection) {
if (typeof collection === 'undefined') return []
if (collection === null) return [null]
if (collection === window) return [window]
if (typeof collection === 'string') return [collection]
if (isArray(collection)) return collection
if (typeof collection.length != 'number') return [collection]
if (typeof collection === 'function' && collection instanceof Function) return [collection]
var arr = []
for (var i = 0; i < collection.length; i++) {
if (Object.prototype.hasOwnProperty.call(collection, i) || i in collection) {
arr.push(collection[i])
}
}
if (!arr.length) return []
return arr
}
function isArray(arr) {
return Object.prototype.toString.call(arr) === "[object Array]";
}
});
require.register("javve-events/index.js", function(exports, require, module){
var events = require('event'),
toArray = require('to-array');
/**
* Bind `el` event `type` to `fn`.
*
* @param {Element} el, NodeList, HTMLCollection or Array
* @param {String} type
* @param {Function} fn
* @param {Boolean} capture
* @api public
*/
exports.bind = function(el, type, fn, capture){
el = toArray(el);
for ( var i = 0; i < el.length; i++ ) {
events.bind(el[i], type, fn, capture);
}
};
/**
* Unbind `el` event `type`'s callback `fn`.
*
* @param {Element} el, NodeList, HTMLCollection or Array
* @param {String} type
* @param {Function} fn
* @param {Boolean} capture
* @api public
*/
exports.unbind = function(el, type, fn, capture){
el = toArray(el);
for ( var i = 0; i < el.length; i++ ) {
events.unbind(el[i], type, fn, capture);
}
};
});
require.register("javve-get-by-class/index.js", function(exports, require, module){
/**
* Find all elements with class `className` inside `container`.
* Use `single = true` to increase performance in older browsers
* when only one element is needed.
*
* @param {String} className
* @param {Element} container
* @param {Boolean} single
* @api public
*/
module.exports = (function() {
if (document.getElementsByClassName) {
return function(container, className, single) {
if (single) {
return container.getElementsByClassName(className)[0];
} else {
return container.getElementsByClassName(className);
}
};
} else if (document.querySelector) {
return function(container, className, single) {
className = '.' + className;
if (single) {
return container.querySelector(className);
} else {
return container.querySelectorAll(className);
}
};
} else {
return function(container, className, single) {
var classElements = [],
tag = '*';
if (container == null) {
container = document;
}
var els = container.getElementsByTagName(tag);
var elsLen = els.length;
var pattern = new RegExp("(^|\\s)"+className+"(\\s|$)");
for (var i = 0, j = 0; i < elsLen; i++) {
if ( pattern.test(els[i].className) ) {
if (single) {
return els[i];
} else {
classElements[j] = els[i];
j++;
}
}
}
return classElements;
};
}
})();
});
require.register("javve-get-attribute/index.js", function(exports, require, module){
/**
* Return the value for `attr` at `element`.
*
* @param {Element} el
* @param {String} attr
* @api public
*/
module.exports = function(el, attr) {
var result = (el.getAttribute && el.getAttribute(attr)) || null;
if( !result ) {
var attrs = el.attributes;
var length = attrs.length;
for(var i = 0; i < length; i++) {
if (attr[i] !== undefined) {
if(attr[i].nodeName === attr) {
result = attr[i].nodeValue;
}
}
}
}
return result;
}
});
require.register("javve-natural-sort/index.js", function(exports, require, module){
/*
* Natural Sort algorithm for Javascript - Version 0.7 - Released under MIT license
* Author: Jim Palmer (based on chunking idea from Dave Koelle)
*/
module.exports = function(a, b, options) {
var re = /(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi,
sre = /(^[ ]*|[ ]*$)/g,
dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/,
hre = /^0x[0-9a-f]+$/i,
ore = /^0/,
options = options || {},
i = function(s) { return options.insensitive && (''+s).toLowerCase() || ''+s },
// convert all to strings strip whitespace
x = i(a).replace(sre, '') || '',
y = i(b).replace(sre, '') || '',
// chunk/tokenize
xN = x.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
yN = y.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'),
// numeric, hex or date detection
xD = parseInt(x.match(hre)) || (xN.length != 1 && x.match(dre) && Date.parse(x)),
yD = parseInt(y.match(hre)) || xD && y.match(dre) && Date.parse(y) || null,
oFxNcL, oFyNcL,
mult = options.desc ? -1 : 1;
// first try and sort Hex codes or Dates
if (yD)
if ( xD < yD ) return -1 * mult;
else if ( xD > yD ) return 1 * mult;
// natural sorting through split numeric strings and default strings
for(var cLoc=0, numS=Math.max(xN.length, yN.length); cLoc < numS; cLoc++) {
// find floats not starting with '0', string or 0 if not defined (Clint Priest)
oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0;
oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0;
// handle numeric vs string comparison - number < string - (Kyle Adams)
if (isNaN(oFxNcL) !== isNaN(oFyNcL)) { return (isNaN(oFxNcL)) ? 1 : -1; }
// rely on string comparison if different types - i.e. '02' < 2 != '02' < '2'
else if (typeof oFxNcL !== typeof oFyNcL) {
oFxNcL += '';
oFyNcL += '';
}
if (oFxNcL < oFyNcL) return -1 * mult;
if (oFxNcL > oFyNcL) return 1 * mult;
}
return 0;
};
/*
var defaultSort = getSortFunction();
module.exports = function(a, b, options) {
if (arguments.length == 1) {
options = a;
return getSortFunction(options);
} else {
return defaultSort(a,b);
}
}
*/
});
require.register("javve-to-string/index.js", function(exports, require, module){
module.exports = function(s) {
s = (s === undefined) ? "" : s;
s = (s === null) ? "" : s;
s = s.toString();
return s;
};
});
require.register("component-type/index.js", function(exports, require, module){
/**
* toString ref.
*/
var toString = Object.prototype.toString;
/**
* Return the type of `val`.
*
* @param {Mixed} val
* @return {String}
* @api public
*/
module.exports = function(val){
switch (toString.call(val)) {
case '[object Date]': return 'date';
case '[object RegExp]': return 'regexp';
case '[object Arguments]': return 'arguments';
case '[object Array]': return 'array';
case '[object Error]': return 'error';
}
if (val === null) return 'null';
if (val === undefined) return 'undefined';
if (val !== val) return 'nan';
if (val && val.nodeType === 1) return 'element';
return typeof val.valueOf();
};
});
require.register("list.js/index.js", function(exports, require, module){
/*
ListJS with beta 1.0.0
By Jonny Strömberg (www.jonnystromberg.com, www.listjs.com)
*/
(function( window, undefined ) {
"use strict";
var document = window.document,
getByClass = require('get-by-class'),
extend = require('extend'),
indexOf = require('indexof');
var List = function(id, options, values) {
var self = this,
init,
Item = require('./src/item')(self),
addAsync = require('./src/add-async')(self),
parse = require('./src/parse')(self);
init = {
start: function() {
self.listClass = "list";
self.searchClass = "search";
self.sortClass = "sort";
self.page = 200;
self.i = 1;
self.items = [];
self.visibleItems = [];
self.matchingItems = [];
self.searched = false;
self.filtered = false;
self.handlers = { 'updated': [] };
self.plugins = {};
self.helpers = {
getByClass: getByClass,
extend: extend,
indexOf: indexOf
};
extend(self, options);
self.listContainer = (typeof(id) === 'string') ? document.getElementById(id) : id;
if (!self.listContainer) { return; }
self.list = getByClass(self.listContainer, self.listClass, true);
self.templater = require('./src/templater')(self);
self.search = require('./src/search')(self);
self.filter = require('./src/filter')(self);
self.sort = require('./src/sort')(self);
this.items();
self.update();
this.plugins();
},
items: function() {
parse(self.list);
if (values !== undefined) {
self.add(values);
}
},
plugins: function() {
for (var i = 0; i < self.plugins.length; i++) {
var plugin = self.plugins[i];
self[plugin.name] = plugin;
plugin.init(self);
}
}
};
/*
* Add object to list
*/
this.add = function(values, callback) {
if (callback) {
addAsync(values, callback);
return;
}
var added = [],
notCreate = false;
if (values[0] === undefined){
values = [values];
}
for (var i = 0, il = values.length; i < il; i++) {
var item = null;
if (values[i] instanceof Item) {
item = values[i];
item.reload();
} else {
notCreate = (self.items.length > self.page) ? true : false;
item = new Item(values[i], undefined, notCreate);
}
self.items.push(item);
added.push(item);
}
self.update();
return added;
};
this.show = function(i, page) {
this.i = i;
this.page = page;
self.update();
return self;
};
/* Removes object from list.
* Loops through the list and removes objects where
* property "valuename" === value
*/
this.remove = function(valueName, value, options) {
var found = 0;
for (var i = 0, il = self.items.length; i < il; i++) {
if (self.items[i].values()[valueName] == value) {
self.templater.remove(self.items[i], options);
self.items.splice(i,1);
il--;
i--;
found++;
}
}
self.update();
return found;
};
/* Gets the objects in the list which
* property "valueName" === value
*/
this.get = function(valueName, value) {
var matchedItems = [];
for (var i = 0, il = self.items.length; i < il; i++) {
var item = self.items[i];
if (item.values()[valueName] == value) {
matchedItems.push(item);
}
}
return matchedItems;
};
/*
* Get size of the list
*/
this.size = function() {
return self.items.length;
};
/*
* Removes all items from the list
*/
this.clear = function() {
self.templater.clear();
self.items = [];
return self;
};
this.on = function(event, callback) {
self.handlers[event].push(callback);
return self;
};
this.off = function(event, callback) {
var e = self.handlers[event];
var index = indexOf(e, callback);
if (index > -1) {
e.splice(index, 1);
}
return self;
};
this.trigger = function(event) {
var i = self.handlers[event].length;
while(i--) {
self.handlers[event][i](self);
}
return self;
};
this.reset = {
filter: function() {
var is = self.items,
il = is.length;
while (il--) {
is[il].filtered = false;
}
return self;
},
search: function() {
var is = self.items,
il = is.length;
while (il--) {
is[il].found = false;
}
return self;
}
};
this.update = function() {
var is = self.items,
il = is.length;
self.visibleItems = [];
self.matchingItems = [];
self.templater.clear();
for (var i = 0; i < il; i++) {
if (is[i].matching() && ((self.matchingItems.length+1) >= self.i && self.visibleItems.length < self.page)) {
is[i].show();
self.visibleItems.push(is[i]);
self.matchingItems.push(is[i]);
} else if (is[i].matching()) {
self.matchingItems.push(is[i]);
is[i].hide();
} else {
is[i].hide();
}
}
self.trigger('updated');
return self;
};
init.start();
};
module.exports = List;
})(window);
});
require.register("list.js/src/search.js", function(exports, require, module){
var events = require('events'),
getByClass = require('get-by-class'),
toString = require('to-string');
module.exports = function(list) {
var item,
text,
columns,
searchString,
customSearch;
var prepare = {
resetList: function() {
list.i = 1;
list.templater.clear();
customSearch = undefined;
},
setOptions: function(args) {
if (args.length == 2 && args[1] instanceof Array) {
columns = args[1];
} else if (args.length == 2 && typeof(args[1]) == "function") {
customSearch = args[1];
} else if (args.length == 3) {
columns = args[1];
customSearch = args[2];
}
},
setColumns: function() {
columns = (columns === undefined) ? prepare.toArray(list.items[0].values()) : columns;
},
setSearchString: function(s) {
s = toString(s).toLowerCase();
s = s.replace(/[-[\]{}()*+?.,\\^$|#]/g, "\\$&"); // Escape regular expression characters
searchString = s;
},
toArray: function(values) {
var tmpColumn = [];
for (var name in values) {
tmpColumn.push(name);
}
return tmpColumn;
}
};
var search = {
list: function() {
for (var k = 0, kl = list.items.length; k < kl; k++) {
search.item(list.items[k]);
}
},
item: function(item) {
item.found = false;
for (var j = 0, jl = columns.length; j < jl; j++) {
if (search.values(item.values(), columns[j])) {
item.found = true;
return;
}
}
},
values: function(values, column) {
if (values.hasOwnProperty(column)) {
text = toString(values[column]).toLowerCase();
if ((searchString !== "") && (text.search(searchString) > -1)) {
return true;
}
}
return false;
},
reset: function() {
list.reset.search();
list.searched = false;
}
};
var searchMethod = function(str) {
list.trigger('searchStart');
prepare.resetList();
prepare.setSearchString(str);
prepare.setOptions(arguments); // str, cols|searchFunction, searchFunction
prepare.setColumns();
if (searchString === "" ) {
search.reset();
} else {
list.searched = true;
if (customSearch) {
customSearch(searchString, columns);
} else {
search.list();
}
}
list.update();
list.trigger('searchComplete');
return list.visibleItems;
};
list.handlers.searchStart = list.handlers.searchStart || [];
list.handlers.searchComplete = list.handlers.searchComplete || [];
events.bind(getByClass(list.listContainer, list.searchClass), 'keyup', function(e) {
var target = e.target || e.srcElement, // IE have srcElement
alreadyCleared = (target.value === "" && !list.searched);
if (!alreadyCleared) { // If oninput already have resetted the list, do nothing
searchMethod(target.value);
}
});
// Used to detect click on HTML5 clear button
events.bind(getByClass(list.listContainer, list.searchClass), 'input', function(e) {
var target = e.target || e.srcElement;
if (target.value === "") {
searchMethod('');
}
});
list.helpers.toString = toString;
return searchMethod;
};
});
require.register("list.js/src/sort.js", function(exports, require, module){
var naturalSort = require('natural-sort'),
classes = require('classes'),
events = require('events'),
getByClass = require('get-by-class'),
getAttribute = require('get-attribute');
module.exports = function(list) {
list.sortFunction = list.sortFunction || function(itemA, itemB, options) {
options.desc = options.order == "desc" ? true : false; // Natural sort uses this format
return naturalSort(itemA.values()[options.valueName], itemB.values()[options.valueName], options);
};
var buttons = {
els: undefined,
clear: function() {
for (var i = 0, il = buttons.els.length; i < il; i++) {
classes(buttons.els[i]).remove('asc');
classes(buttons.els[i]).remove('desc');
}
},
getOrder: function(btn) {
var predefinedOrder = getAttribute(btn, 'data-order');
if (predefinedOrder == "asc" || predefinedOrder == "desc") {
return predefinedOrder;
} else if (classes(btn).has('desc')) {
return "asc";
} else if (classes(btn).has('asc')) {
return "desc";
} else {
return "asc";
}
},
getInSensitive: function(btn, options) {
var insensitive = getAttribute(btn, 'data-insensitive');
if (insensitive === "true") {
options.insensitive = true;
} else {
options.insensitive = false;
}
},
setOrder: function(options) {
for (var i = 0, il = buttons.els.length; i < il; i++) {
var btn = buttons.els[i];
if (getAttribute(btn, 'data-sort') !== options.valueName) {
continue;
}
var predefinedOrder = getAttribute(btn, 'data-order');
if (predefinedOrder == "asc" || predefinedOrder == "desc") {
if (predefinedOrder == options.order) {
classes(btn).add(options.order);
}
} else {
classes(btn).add(options.order);
}
}
}
};
var sort = function() {
list.trigger('sortStart');
options = {};
var target = arguments[0].currentTarget || arguments[0].srcElement || undefined;
if (target) {
options.valueName = getAttribute(target, 'data-sort');
buttons.getInSensitive(target, options);
options.order = buttons.getOrder(target);
} else {
options = arguments[1] || options;
options.valueName = arguments[0];
options.order = options.order || "asc";
options.insensitive = (typeof options.insensitive == "undefined") ? true : options.insensitive;
}
buttons.clear();
buttons.setOrder(options);
options.sortFunction = options.sortFunction || list.sortFunction;
list.items.sort(function(a, b) {
return options.sortFunction(a, b, options);
});
list.update();
list.trigger('sortComplete');
};
// Add handlers
list.handlers.sortStart = list.handlers.sortStart || [];
list.handlers.sortComplete = list.handlers.sortComplete || [];
buttons.els = getByClass(list.listContainer, list.sortClass);
events.bind(buttons.els, 'click', sort);
list.on('searchStart', buttons.clear);
list.on('filterStart', buttons.clear);
// Helpers
list.helpers.classes = classes;
list.helpers.naturalSort = naturalSort;
list.helpers.events = events;
list.helpers.getAttribute = getAttribute;
return sort;
};
});
require.register("list.js/src/item.js", function(exports, require, module){
module.exports = function(list) {
return function(initValues, element, notCreate) {
var item = this;
this._values = {};
this.found = false; // Show if list.searched == true and this.found == true
this.filtered = false;// Show if list.filtered == true and this.filtered == true
var init = function(initValues, element, notCreate) {
if (element === undefined) {
if (notCreate) {
item.values(initValues, notCreate);
} else {
item.values(initValues);
}
} else {
item.elm = element;
var values = list.templater.get(item, initValues);
item.values(values);
}
};
this.values = function(newValues, notCreate) {
if (newValues !== undefined) {
for(var name in newValues) {
item._values[name] = newValues[name];
}
if (notCreate !== true) {
list.templater.set(item, item.values());
}
} else {
return item._values;
}
};
this.show = function() {
list.templater.show(item);
};
this.hide = function() {
list.templater.hide(item);
};
this.matching = function() {
return (
(list.filtered && list.searched && item.found && item.filtered) ||
(list.filtered && !list.searched && item.filtered) ||
(!list.filtered && list.searched && item.found) ||
(!list.filtered && !list.searched)
);
};
this.visible = function() {
return (item.elm.parentNode == list.list) ? true : false;
};
init(initValues, element, notCreate);
};
};
});
require.register("list.js/src/templater.js", function(exports, require, module){
var getByClass = require('get-by-class');
var Templater = function(list) {
var itemSource = getItemSource(list.item),
templater = this;
function getItemSource(item) {
if (item === undefined) {
var nodes = list.list.childNodes,
items = [];
for (var i = 0, il = nodes.length; i < il; i++) {
// Only textnodes have a data attribute
if (nodes[i].data === undefined) {
return nodes[i];
}
}
return null;
} else if (item.indexOf("<") !== -1) { // Try create html element of list, do not work for tables!!
var div = document.createElement('div');
div.innerHTML = item;
return div.firstChild;
} else {
return document.getElementById(list.item);
}
}
/* Get values from element */
this.get = function(item, valueNames) {
templater.create(item);
var values = {};
for(var i = 0, il = valueNames.length; i < il; i++) {
var elm = getByClass(item.elm, valueNames[i], true);
values[valueNames[i]] = elm ? elm.innerHTML : "";
}
return values;
};
/* Sets values at element */
this.set = function(item, values) {
if (!templater.create(item)) {
for(var v in values) {
if (values.hasOwnProperty(v)) {
// TODO speed up if possible
var elm = getByClass(item.elm, v, true);
if (elm) {
/* src attribute for image tag & text for other tags */
if (elm.tagName === "IMG" && values[v] !== "") {
elm.src = values[v];
} else {
elm.innerHTML = values[v];
}
}
}
}
}
};
this.create = function(item) {
if (item.elm !== undefined) {
return false;
}
/* If item source does not exists, use the first item in list as
source for new items */
var newItem = itemSource.cloneNode(true);
newItem.removeAttribute('id');
item.elm = newItem;
templater.set(item, item.values());
return true;
};
this.remove = function(item) {
list.list.removeChild(item.elm);
};
this.show = function(item) {
templater.create(item);
list.list.appendChild(item.elm);
};
this.hide = function(item) {
if (item.elm !== undefined && item.elm.parentNode === list.list) {
list.list.removeChild(item.elm);
}
};
this.clear = function() {
/* .innerHTML = ''; fucks up IE */
if (list.list.hasChildNodes()) {
while (list.list.childNodes.length >= 1)
{
list.list.removeChild(list.list.firstChild);
}
}
};
};
module.exports = function(list) {
return new Templater(list);
};
});
require.register("list.js/src/filter.js", function(exports, require, module){
module.exports = function(list) {
// Add handlers
list.handlers.filterStart = list.handlers.filterStart || [];
list.handlers.filterComplete = list.handlers.filterComplete || [];
return function(filterFunction) {
list.trigger('filterStart');
list.i = 1; // Reset paging
list.reset.filter();
if (filterFunction === undefined) {
list.filtered = false;
} else {
list.filtered = true;
var is = list.items;
for (var i = 0, il = is.length; i < il; i++) {
var item = is[i];
if (filterFunction(item)) {
item.filtered = true;
} else {
item.filtered = false;
}
}
}
list.update();
list.trigger('filterComplete');
return list.visibleItems;
};
};
});
require.register("list.js/src/add-async.js", function(exports, require, module){
module.exports = function(list) {
return function(values, callback, items) {
var valuesToAdd = values.splice(0, 100);
items = items || [];
items = items.concat(list.add(valuesToAdd));
if (values.length > 0) {
setTimeout(function() {
addAsync(values, callback, items);
}, 10);
} else {
list.update();
callback(items);
}
};
};
});
require.register("list.js/src/parse.js", function(exports, require, module){
module.exports = function(list) {
var Item = require('./item')(list);
var getChildren = function(parent) {
var nodes = parent.childNodes,
items = [];
for (var i = 0, il = nodes.length; i < il; i++) {
// Only textnodes have a data attribute
if (nodes[i].data === undefined) {
items.push(nodes[i]);
}
}
return items;
};
var parse = function(itemElements, valueNames) {
for (var i = 0, il = itemElements.length; i < il; i++) {
list.items.push(new Item(valueNames, itemElements[i]));
}
};
var parseAsync = function(itemElements, valueNames) {
var itemsToIndex = itemElements.splice(0, 100); // TODO: If < 100 items, what happens in IE etc?
parse(itemsToIndex, valueNames);
if (itemElements.length > 0) {
setTimeout(function() {
init.items.indexAsync(itemElements, valueNames);
}, 10);
} else {
list.update();
// TODO: Add indexed callback
}
};
return function() {
var itemsToIndex = getChildren(list.list),
valueNames = list.valueNames;
if (list.indexAsync) {
parseAsync(itemsToIndex, valueNames);
} else {
parse(itemsToIndex, valueNames);
}
};
};
});
require.alias("component-classes/index.js", "list.js/deps/classes/index.js");
require.alias("component-classes/index.js", "classes/index.js");
require.alias("component-indexof/index.js", "component-classes/deps/indexof/index.js");
require.alias("segmentio-extend/index.js", "list.js/deps/extend/index.js");
require.alias("segmentio-extend/index.js", "extend/index.js");
require.alias("component-indexof/index.js", "list.js/deps/indexof/index.js");
require.alias("component-indexof/index.js", "indexof/index.js");
require.alias("javve-events/index.js", "list.js/deps/events/index.js");
require.alias("javve-events/index.js", "events/index.js");
require.alias("component-event/index.js", "javve-events/deps/event/index.js");
require.alias("timoxley-to-array/index.js", "javve-events/deps/to-array/index.js");
require.alias("javve-get-by-class/index.js", "list.js/deps/get-by-class/index.js");
require.alias("javve-get-by-class/index.js", "get-by-class/index.js");
require.alias("javve-get-attribute/index.js", "list.js/deps/get-attribute/index.js");
require.alias("javve-get-attribute/index.js", "get-attribute/index.js");
require.alias("javve-natural-sort/index.js", "list.js/deps/natural-sort/index.js");
require.alias("javve-natural-sort/index.js", "natural-sort/index.js");
require.alias("javve-to-string/index.js", "list.js/deps/to-string/index.js");
require.alias("javve-to-string/index.js", "list.js/deps/to-string/index.js");
require.alias("javve-to-string/index.js", "to-string/index.js");
require.alias("javve-to-string/index.js", "javve-to-string/index.js");
require.alias("component-type/index.js", "list.js/deps/type/index.js");
require.alias("component-type/index.js", "type/index.js");
if (typeof exports == "object") {
module.exports = require("list.js");
} else if (typeof define == "function" && define.amd) {
define(function(){ return require("list.js"); });
} else {
this["List"] = require("list.js");
}})(); list.js-1.1.1/index.js 0000664 0000000 0000000 00000013771 12313007001 0014541 0 ustar 00root root 0000000 0000000 /*
ListJS with beta 1.0.0
By Jonny Strömberg (www.jonnystromberg.com, www.listjs.com)
*/
(function( window, undefined ) {
"use strict";
var document = window.document,
getByClass = require('get-by-class'),
extend = require('extend'),
indexOf = require('indexof');
var List = function(id, options, values) {
var self = this,
init,
Item = require('./src/item')(self),
addAsync = require('./src/add-async')(self),
parse = require('./src/parse')(self);
init = {
start: function() {
self.listClass = "list";
self.searchClass = "search";
self.sortClass = "sort";
self.page = 200;
self.i = 1;
self.items = [];
self.visibleItems = [];
self.matchingItems = [];
self.searched = false;
self.filtered = false;
self.handlers = { 'updated': [] };
self.plugins = {};
self.helpers = {
getByClass: getByClass,
extend: extend,
indexOf: indexOf
};
extend(self, options);
self.listContainer = (typeof(id) === 'string') ? document.getElementById(id) : id;
if (!self.listContainer) { return; }
self.list = getByClass(self.listContainer, self.listClass, true);
self.templater = require('./src/templater')(self);
self.search = require('./src/search')(self);
self.filter = require('./src/filter')(self);
self.sort = require('./src/sort')(self);
this.items();
self.update();
this.plugins();
},
items: function() {
parse(self.list);
if (values !== undefined) {
self.add(values);
}
},
plugins: function() {
for (var i = 0; i < self.plugins.length; i++) {
var plugin = self.plugins[i];
self[plugin.name] = plugin;
plugin.init(self);
}
}
};
/*
* Add object to list
*/
this.add = function(values, callback) {
if (callback) {
addAsync(values, callback);
return;
}
var added = [],
notCreate = false;
if (values[0] === undefined){
values = [values];
}
for (var i = 0, il = values.length; i < il; i++) {
var item = null;
if (values[i] instanceof Item) {
item = values[i];
item.reload();
} else {
notCreate = (self.items.length > self.page) ? true : false;
item = new Item(values[i], undefined, notCreate);
}
self.items.push(item);
added.push(item);
}
self.update();
return added;
};
this.show = function(i, page) {
this.i = i;
this.page = page;
self.update();
return self;
};
/* Removes object from list.
* Loops through the list and removes objects where
* property "valuename" === value
*/
this.remove = function(valueName, value, options) {
var found = 0;
for (var i = 0, il = self.items.length; i < il; i++) {
if (self.items[i].values()[valueName] == value) {
self.templater.remove(self.items[i], options);
self.items.splice(i,1);
il--;
i--;
found++;
}
}
self.update();
return found;
};
/* Gets the objects in the list which
* property "valueName" === value
*/
this.get = function(valueName, value) {
var matchedItems = [];
for (var i = 0, il = self.items.length; i < il; i++) {
var item = self.items[i];
if (item.values()[valueName] == value) {
matchedItems.push(item);
}
}
return matchedItems;
};
/*
* Get size of the list
*/
this.size = function() {
return self.items.length;
};
/*
* Removes all items from the list
*/
this.clear = function() {
self.templater.clear();
self.items = [];
return self;
};
this.on = function(event, callback) {
self.handlers[event].push(callback);
return self;
};
this.off = function(event, callback) {
var e = self.handlers[event];
var index = indexOf(e, callback);
if (index > -1) {
e.splice(index, 1);
}
return self;
};
this.trigger = function(event) {
var i = self.handlers[event].length;
while(i--) {
self.handlers[event][i](self);
}
return self;
};
this.reset = {
filter: function() {
var is = self.items,
il = is.length;
while (il--) {
is[il].filtered = false;
}
return self;
},
search: function() {
var is = self.items,
il = is.length;
while (il--) {
is[il].found = false;
}
return self;
}
};
this.update = function() {
var is = self.items,
il = is.length;
self.visibleItems = [];
self.matchingItems = [];
self.templater.clear();
for (var i = 0; i < il; i++) {
if (is[i].matching() && ((self.matchingItems.length+1) >= self.i && self.visibleItems.length < self.page)) {
is[i].show();
self.visibleItems.push(is[i]);
self.matchingItems.push(is[i]);
} else if (is[i].matching()) {
self.matchingItems.push(is[i]);
is[i].hide();
} else {
is[i].hide();
}
}
self.trigger('updated');
return self;
};
init.start();
};
module.exports = List;
})(window);
list.js-1.1.1/package.json 0000664 0000000 0000000 00000001204 12313007001 0015346 0 ustar 00root root 0000000 0000000 {
"name": "list.js",
"version": "1.1.1",
"description": "Component package manager consuming git repositories",
"keywords": [
"list",
"search",
"sort",
"table",
"dom",
"html",
"ui"
],
"author": "Jonny Strömberg ",
"repository": "git://github.com/javve/list.js.git",
"dependencies": {},
"devDependencies": {
"grunt": "~0.4.1",
"grunt-shell": "~0.5.0",
"grunt-contrib-watch": "~0.5.3",
"grunt-contrib-uglify": "~0.2.7",
"grunt-contrib-jshint": "~0.7.1",
"grunt-mocha": "~0.4.1"
},
"main": "index",
"engines": {
"node": ">= 0.10.21"
}
}
list.js-1.1.1/src/ 0000775 0000000 0000000 00000000000 12313007001 0013652 5 ustar 00root root 0000000 0000000 list.js-1.1.1/src/add-async.js 0000664 0000000 0000000 00000000674 12313007001 0016062 0 ustar 00root root 0000000 0000000 module.exports = function(list) {
return function(values, callback, items) {
var valuesToAdd = values.splice(0, 100);
items = items || [];
items = items.concat(list.add(valuesToAdd));
if (values.length > 0) {
setTimeout(function() {
addAsync(values, callback, items);
}, 10);
} else {
list.update();
callback(items);
}
};
}; list.js-1.1.1/src/filter.js 0000664 0000000 0000000 00000001573 12313007001 0015503 0 ustar 00root root 0000000 0000000 module.exports = function(list) {
// Add handlers
list.handlers.filterStart = list.handlers.filterStart || [];
list.handlers.filterComplete = list.handlers.filterComplete || [];
return function(filterFunction) {
list.trigger('filterStart');
list.i = 1; // Reset paging
list.reset.filter();
if (filterFunction === undefined) {
list.filtered = false;
} else {
list.filtered = true;
var is = list.items;
for (var i = 0, il = is.length; i < il; i++) {
var item = is[i];
if (filterFunction(item)) {
item.filtered = true;
} else {
item.filtered = false;
}
}
}
list.update();
list.trigger('filterComplete');
return list.visibleItems;
};
};
list.js-1.1.1/src/item.js 0000664 0000000 0000000 00000003553 12313007001 0015154 0 ustar 00root root 0000000 0000000 module.exports = function(list) {
return function(initValues, element, notCreate) {
var item = this;
this._values = {};
this.found = false; // Show if list.searched == true and this.found == true
this.filtered = false;// Show if list.filtered == true and this.filtered == true
var init = function(initValues, element, notCreate) {
if (element === undefined) {
if (notCreate) {
item.values(initValues, notCreate);
} else {
item.values(initValues);
}
} else {
item.elm = element;
var values = list.templater.get(item, initValues);
item.values(values);
}
};
this.values = function(newValues, notCreate) {
if (newValues !== undefined) {
for(var name in newValues) {
item._values[name] = newValues[name];
}
if (notCreate !== true) {
list.templater.set(item, item.values());
}
} else {
return item._values;
}
};
this.show = function() {
list.templater.show(item);
};
this.hide = function() {
list.templater.hide(item);
};
this.matching = function() {
return (
(list.filtered && list.searched && item.found && item.filtered) ||
(list.filtered && !list.searched && item.filtered) ||
(!list.filtered && list.searched && item.found) ||
(!list.filtered && !list.searched)
);
};
this.visible = function() {
return (item.elm.parentNode == list.list) ? true : false;
};
init(initValues, element, notCreate);
};
};
list.js-1.1.1/src/parse.js 0000664 0000000 0000000 00000002545 12313007001 0015330 0 ustar 00root root 0000000 0000000 module.exports = function(list) {
var Item = require('./item')(list);
var getChildren = function(parent) {
var nodes = parent.childNodes,
items = [];
for (var i = 0, il = nodes.length; i < il; i++) {
// Only textnodes have a data attribute
if (nodes[i].data === undefined) {
items.push(nodes[i]);
}
}
return items;
};
var parse = function(itemElements, valueNames) {
for (var i = 0, il = itemElements.length; i < il; i++) {
list.items.push(new Item(valueNames, itemElements[i]));
}
};
var parseAsync = function(itemElements, valueNames) {
var itemsToIndex = itemElements.splice(0, 100); // TODO: If < 100 items, what happens in IE etc?
parse(itemsToIndex, valueNames);
if (itemElements.length > 0) {
setTimeout(function() {
init.items.indexAsync(itemElements, valueNames);
}, 10);
} else {
list.update();
// TODO: Add indexed callback
}
};
return function() {
var itemsToIndex = getChildren(list.list),
valueNames = list.valueNames;
if (list.indexAsync) {
parseAsync(itemsToIndex, valueNames);
} else {
parse(itemsToIndex, valueNames);
}
};
};
list.js-1.1.1/src/search.js 0000664 0000000 0000000 00000007314 12313007001 0015462 0 ustar 00root root 0000000 0000000 var events = require('events'),
getByClass = require('get-by-class'),
toString = require('to-string');
module.exports = function(list) {
var item,
text,
columns,
searchString,
customSearch;
var prepare = {
resetList: function() {
list.i = 1;
list.templater.clear();
customSearch = undefined;
},
setOptions: function(args) {
if (args.length == 2 && args[1] instanceof Array) {
columns = args[1];
} else if (args.length == 2 && typeof(args[1]) == "function") {
customSearch = args[1];
} else if (args.length == 3) {
columns = args[1];
customSearch = args[2];
}
},
setColumns: function() {
columns = (columns === undefined) ? prepare.toArray(list.items[0].values()) : columns;
},
setSearchString: function(s) {
s = toString(s).toLowerCase();
s = s.replace(/[-[\]{}()*+?.,\\^$|#]/g, "\\$&"); // Escape regular expression characters
searchString = s;
},
toArray: function(values) {
var tmpColumn = [];
for (var name in values) {
tmpColumn.push(name);
}
return tmpColumn;
}
};
var search = {
list: function() {
for (var k = 0, kl = list.items.length; k < kl; k++) {
search.item(list.items[k]);
}
},
item: function(item) {
item.found = false;
for (var j = 0, jl = columns.length; j < jl; j++) {
if (search.values(item.values(), columns[j])) {
item.found = true;
return;
}
}
},
values: function(values, column) {
if (values.hasOwnProperty(column)) {
text = toString(values[column]).toLowerCase();
if ((searchString !== "") && (text.search(searchString) > -1)) {
return true;
}
}
return false;
},
reset: function() {
list.reset.search();
list.searched = false;
}
};
var searchMethod = function(str) {
list.trigger('searchStart');
prepare.resetList();
prepare.setSearchString(str);
prepare.setOptions(arguments); // str, cols|searchFunction, searchFunction
prepare.setColumns();
if (searchString === "" ) {
search.reset();
} else {
list.searched = true;
if (customSearch) {
customSearch(searchString, columns);
} else {
search.list();
}
}
list.update();
list.trigger('searchComplete');
return list.visibleItems;
};
list.handlers.searchStart = list.handlers.searchStart || [];
list.handlers.searchComplete = list.handlers.searchComplete || [];
events.bind(getByClass(list.listContainer, list.searchClass), 'keyup', function(e) {
var target = e.target || e.srcElement, // IE have srcElement
alreadyCleared = (target.value === "" && !list.searched);
if (!alreadyCleared) { // If oninput already have resetted the list, do nothing
searchMethod(target.value);
}
});
// Used to detect click on HTML5 clear button
events.bind(getByClass(list.listContainer, list.searchClass), 'input', function(e) {
var target = e.target || e.srcElement;
if (target.value === "") {
searchMethod('');
}
});
list.helpers.toString = toString;
return searchMethod;
};
list.js-1.1.1/src/sort.js 0000664 0000000 0000000 00000007232 12313007001 0015203 0 ustar 00root root 0000000 0000000 var naturalSort = require('natural-sort'),
classes = require('classes'),
events = require('events'),
getByClass = require('get-by-class'),
getAttribute = require('get-attribute');
module.exports = function(list) {
list.sortFunction = list.sortFunction || function(itemA, itemB, options) {
options.desc = options.order == "desc" ? true : false; // Natural sort uses this format
return naturalSort(itemA.values()[options.valueName], itemB.values()[options.valueName], options);
};
var buttons = {
els: undefined,
clear: function() {
for (var i = 0, il = buttons.els.length; i < il; i++) {
classes(buttons.els[i]).remove('asc');
classes(buttons.els[i]).remove('desc');
}
},
getOrder: function(btn) {
var predefinedOrder = getAttribute(btn, 'data-order');
if (predefinedOrder == "asc" || predefinedOrder == "desc") {
return predefinedOrder;
} else if (classes(btn).has('desc')) {
return "asc";
} else if (classes(btn).has('asc')) {
return "desc";
} else {
return "asc";
}
},
getInSensitive: function(btn, options) {
var insensitive = getAttribute(btn, 'data-insensitive');
if (insensitive === "true") {
options.insensitive = true;
} else {
options.insensitive = false;
}
},
setOrder: function(options) {
for (var i = 0, il = buttons.els.length; i < il; i++) {
var btn = buttons.els[i];
if (getAttribute(btn, 'data-sort') !== options.valueName) {
continue;
}
var predefinedOrder = getAttribute(btn, 'data-order');
if (predefinedOrder == "asc" || predefinedOrder == "desc") {
if (predefinedOrder == options.order) {
classes(btn).add(options.order);
}
} else {
classes(btn).add(options.order);
}
}
}
};
var sort = function() {
list.trigger('sortStart');
options = {};
var target = arguments[0].currentTarget || arguments[0].srcElement || undefined;
if (target) {
options.valueName = getAttribute(target, 'data-sort');
buttons.getInSensitive(target, options);
options.order = buttons.getOrder(target);
} else {
options = arguments[1] || options;
options.valueName = arguments[0];
options.order = options.order || "asc";
options.insensitive = (typeof options.insensitive == "undefined") ? true : options.insensitive;
}
buttons.clear();
buttons.setOrder(options);
options.sortFunction = options.sortFunction || list.sortFunction;
list.items.sort(function(a, b) {
return options.sortFunction(a, b, options);
});
list.update();
list.trigger('sortComplete');
};
// Add handlers
list.handlers.sortStart = list.handlers.sortStart || [];
list.handlers.sortComplete = list.handlers.sortComplete || [];
buttons.els = getByClass(list.listContainer, list.sortClass);
events.bind(buttons.els, 'click', sort);
list.on('searchStart', buttons.clear);
list.on('filterStart', buttons.clear);
// Helpers
list.helpers.classes = classes;
list.helpers.naturalSort = naturalSort;
list.helpers.events = events;
list.helpers.getAttribute = getAttribute;
return sort;
};
list.js-1.1.1/src/templater.js 0000664 0000000 0000000 00000006010 12313007001 0016202 0 ustar 00root root 0000000 0000000 var getByClass = require('get-by-class');
var Templater = function(list) {
var itemSource = getItemSource(list.item),
templater = this;
function getItemSource(item) {
if (item === undefined) {
var nodes = list.list.childNodes,
items = [];
for (var i = 0, il = nodes.length; i < il; i++) {
// Only textnodes have a data attribute
if (nodes[i].data === undefined) {
return nodes[i];
}
}
return null;
} else if (item.indexOf("<") !== -1) { // Try create html element of list, do not work for tables!!
var div = document.createElement('div');
div.innerHTML = item;
return div.firstChild;
} else {
return document.getElementById(list.item);
}
}
/* Get values from element */
this.get = function(item, valueNames) {
templater.create(item);
var values = {};
for(var i = 0, il = valueNames.length; i < il; i++) {
var elm = getByClass(item.elm, valueNames[i], true);
values[valueNames[i]] = elm ? elm.innerHTML : "";
}
return values;
};
/* Sets values at element */
this.set = function(item, values) {
if (!templater.create(item)) {
for(var v in values) {
if (values.hasOwnProperty(v)) {
// TODO speed up if possible
var elm = getByClass(item.elm, v, true);
if (elm) {
/* src attribute for image tag & text for other tags */
if (elm.tagName === "IMG" && values[v] !== "") {
elm.src = values[v];
} else {
elm.innerHTML = values[v];
}
}
}
}
}
};
this.create = function(item) {
if (item.elm !== undefined) {
return false;
}
/* If item source does not exists, use the first item in list as
source for new items */
var newItem = itemSource.cloneNode(true);
newItem.removeAttribute('id');
item.elm = newItem;
templater.set(item, item.values());
return true;
};
this.remove = function(item) {
list.list.removeChild(item.elm);
};
this.show = function(item) {
templater.create(item);
list.list.appendChild(item.elm);
};
this.hide = function(item) {
if (item.elm !== undefined && item.elm.parentNode === list.list) {
list.list.removeChild(item.elm);
}
};
this.clear = function() {
/* .innerHTML = ''; fucks up IE */
if (list.list.hasChildNodes()) {
while (list.list.childNodes.length >= 1)
{
list.list.removeChild(list.list.firstChild);
}
}
};
};
module.exports = function(list) {
return new Templater(list);
};
list.js-1.1.1/test/ 0000775 0000000 0000000 00000000000 12313007001 0014042 5 ustar 00root root 0000000 0000000 list.js-1.1.1/test/fixtures.js 0000664 0000000 0000000 00000002235 12313007001 0016253 0 ustar 00root root 0000000 0000000 var fixture = {
list: function(valueNames, items) {
var listHtml = $(''),
item = "";
item = "- ";
for (var i = 0; i < valueNames.length; i++) {
item += '';
}
item += "
";
$(document.body).append(listHtml);
items = items || [];
return new List('list', {
valueNames: valueNames,
item: item
}, items);
},
removeList: function() {
$('#list').remove();
},
jonny: {
name: "Jonny Strömberg",
born: '1986'
},
martina: {
name: "Martina Elm",
born: '1986'
},
angelica: {
name: "Angelica Abraham",
born: '1986'
},
sebastian: {
name: "Sebastian Höglund",
born: '1989'
},
imma: {
name: "Imma Grafström",
born: '1953'
},
hasse: {
name: "Hasse Strömberg",
born: '1955'
}
};
fixture.all = [
fixture.jonny,
fixture.martina,
fixture.angelica,
fixture.sebastian,
fixture.imma,
fixture.hasse
]; list.js-1.1.1/test/index.html 0000775 0000000 0000000 00000003055 12313007001 0016045 0 ustar 00root root 0000000 0000000
List.js Mocha Tests
list.js-1.1.1/test/test.add-get-remove.js 0000664 0000000 0000000 00000006160 12313007001 0020161 0 ustar 00root root 0000000 0000000 describe('Add, get, remove', function() {
var list;
before(function() {
list = fixture.list(['name'], [ { name: "Jonny" } ]);
});
after(function() {
fixture.removeList();
});
afterEach(function() {
list.clear();
list.add({ name: "Jonny" });
});
describe('Add', function() {
it('should add one item', function() {
list.add({ name: 'Jonas' });
expect(list.items.length).to.equal(2);
});
it('should add two items', function() {
list.add([
{ name: 'Martina' },
{ name: 'Angelica' }
]);
expect(list.items.length).to.equal(3);
});
it('should add async items', function(done) {
list.add([
{ name: 'Sven' }
], function() {
expect(list.items.length).to.equal(2);
done();
});
});
it('should add async items to empty list', function(done) {
list.clear();
list.add([
{ name: 'Sven' }
], function() {
expect(list.items.length).to.equal(1);
done();
});
});
});
describe('Get', function() {
it('should return array with one item', function() {
var items = list.get('name', 'Jonny');
expect(items[0].values().name).to.equal('Jonny');
});
it('should return empty array', function() {
var items = list.get('name', 'jonny');
expect(items.length).to.be.zero;
});
it('should return two items', function() {
list.add({ name: 'Jonny' });
var items = list.get('name', 'Jonny');
expect(items.length).to.equal(2);
expect(items[0].values().name).to.equal('Jonny');
expect(items[1].values().name).to.equal('Jonny');
});
});
describe('Remove', function() {
it('should remove one item', function() {
list.add({ name: "Jonas" });
expect(list.items.length).to.equal(2);
var count = list.remove('name', 'Jonas');
expect(count).to.equal(1);
expect(list.items.length).to.equal(1);
});
it('should not remove anything due to case sensitivity', function() {
var count = list.remove('name', 'jonny');
expect(count).to.be.equal(0);
expect(list.items.length).to.equal(1);
});
it('should remove eight items', function() {
list.add({ name: 'Jonny' });
list.add({ name: 'Jonny' });
list.add({ name: 'Sven' });
list.add({ name: 'Jonny' });
list.add({ name: 'Jonny' });
list.add({ name: 'Jonny' });
list.add({ name: 'Jonas' });
list.add({ name: 'Jonny' });
list.add({ name: 'Jonny' });
expect(list.items.length).to.equal(10);
var count = list.remove('name', 'Jonny');
expect(count).to.equal(8);
expect(list.items.length).to.equal(2);
});
});
});
list.js-1.1.1/test/test.buttons.js 0000664 0000000 0000000 00000020710 12313007001 0017054 0 ustar 00root root 0000000 0000000 function fireKeyup(el) {
if (document.createEvent) {
var evObj;
if (window.KeyEvent) {
evObj = document.createEvent('KeyEvents');
evObj.initKeyEvent('keyup', true, true, window, false, false, false, false, 13, 0);
} else {
evObj = document.createEvent('UIEvents');
evObj.initUIEvent('keyup', true, true, window, 1);
}
el.dispatchEvent(evObj);
} else if( document.createEventObject ) {
el.fireEvent('onkeyup');
} else {
// IE 5.0, seriously? :)
}
}
// http://stackoverflow.com/questions/5658849/whats-the-equivalent-of-jquerys-trigger-method-without-jquery
function fireClick(el) {
var evt;
if (document.createEvent) {
evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
}
(evt) ? el.dispatchEvent(evt) : (el.click && el.click());
}
describe('Button', function() {
var list;
beforeEach(function() {
$('body').append($('\
\
Sort name\
Sort name asc\
Sort name desc\
\
'));
list = new List('parse-list', {
valueNames: ['name', 'born']
});
});
afterEach(function() {
$('#parse-list').remove();
});
describe('Sort', function() {
it('should trigger sortStart', function(done) {
list.on('sortComplete', function() {
done();
});
fireClick($('#sort-name')[0]);
});
it('should trigger sortComplete', function(done) {
list.on('sortComplete', function() {
done();
});
fireClick($('#sort-name')[0]);
});
it('should switch sorting order when clicking multiple times', function(done) {
this.timeout(5000);
var sortRun = 0;
list.on('sortComplete', function() {
sortRun++;
if (sortRun == 1) {
expect($('#sort-name').hasClass('asc')).to.be(true);
expect($('#sort-name').hasClass('desc')).to.be(false);
setTimeout(function() {
fireClick($('#sort-name')[0]);
}, 50);
} else if (sortRun == 2) {
expect($('#sort-name').hasClass('asc')).to.be(false);
expect($('#sort-name').hasClass('desc')).to.be(true);
setTimeout(function() {
fireClick($('#sort-name')[0]);
}, 50);
} else if (sortRun == 3) {
expect($('#sort-name').hasClass('asc')).to.be(true);
expect($('#sort-name').hasClass('desc')).to.be(false);
done();
}
});
expect($('#sort-name').hasClass('asc')).to.be(false);
expect($('#sort-name').hasClass('desc')).to.be(false);
fireClick($('#sort-name')[0]);
});
it('should sort with predefined order', function(done) {
this.timeout(10000);
var sortRun = 0;
list.on('sortComplete', function() {
sortRun++;
if (sortRun == 1) {
expect($('#sort-name').hasClass('asc')).to.be(true);
expect($('#sort-name').hasClass('desc')).to.be(false);
expect($('#sort-name-asc').hasClass('asc')).to.be(true);
expect($('#sort-name-asc').hasClass('desc')).to.be(false);
expect($('#sort-name-desc').hasClass('asc')).to.be(false);
expect($('#sort-name-desc').hasClass('desc')).to.be(false);
setTimeout(function() {
fireClick($('#sort-name-asc')[0]);
}, 50);
} else if (sortRun == 2) {
expect($('#sort-name').hasClass('asc')).to.be(true);
expect($('#sort-name').hasClass('desc')).to.be(false);
expect($('#sort-name-asc').hasClass('asc')).to.be(true);
expect($('#sort-name-asc').hasClass('desc')).to.be(false);
expect($('#sort-name-desc').hasClass('asc')).to.be(false);
expect($('#sort-name-desc').hasClass('desc')).to.be(false);
setTimeout(function() {
fireClick($('#sort-name-asc')[0]);
}, 50);
} else if (sortRun == 3) {
expect($('#sort-name').hasClass('asc')).to.be(true);
expect($('#sort-name').hasClass('desc')).to.be(false);
expect($('#sort-name-asc').hasClass('asc')).to.be(true);
expect($('#sort-name-asc').hasClass('desc')).to.be(false);
expect($('#sort-name-desc').hasClass('asc')).to.be(false);
expect($('#sort-name-desc').hasClass('desc')).to.be(false);
setTimeout(function() {
fireClick($('#sort-name-desc')[0]);
}, 50);
} else if (sortRun == 4) {
expect($('#sort-name').hasClass('asc')).to.be(false);
expect($('#sort-name').hasClass('desc')).to.be(true);
expect($('#sort-name-asc').hasClass('asc')).to.be(false);
expect($('#sort-name-asc').hasClass('desc')).to.be(false);
expect($('#sort-name-desc').hasClass('asc')).to.be(false);
expect($('#sort-name-desc').hasClass('desc')).to.be(true);
setTimeout(function() {
fireClick($('#sort-name-desc')[0]);
}, 50);
} else if (sortRun == 5) {
expect($('#sort-name').hasClass('asc')).to.be(false);
expect($('#sort-name').hasClass('desc')).to.be(true);
expect($('#sort-name-asc').hasClass('asc')).to.be(false);
expect($('#sort-name-asc').hasClass('desc')).to.be(false);
expect($('#sort-name-desc').hasClass('asc')).to.be(false);
expect($('#sort-name-desc').hasClass('desc')).to.be(true);
done();
}
});
expect($('#sort-name').hasClass('asc')).to.be(false);
expect($('#sort-name').hasClass('desc')).to.be(false);
expect($('#sort-name-asc').hasClass('asc')).to.be(false);
expect($('#sort-name-asc').hasClass('desc')).to.be(false);
expect($('#sort-name-desc').hasClass('asc')).to.be(false);
expect($('#sort-name-desc').hasClass('desc')).to.be(false);
fireClick($('#sort-name-asc')[0]);
});
it('buttons should change class when sorting programmatically', function(done) {
list.on('sortComplete', function() {
expect($('#sort-name').hasClass('asc')).to.be(true);
expect($('#sort-name').hasClass('desc')).to.be(false);
expect($('#sort-name-asc').hasClass('asc')).to.be(true);
expect($('#sort-name-asc').hasClass('desc')).to.be(false);
expect($('#sort-name-desc').hasClass('asc')).to.be(false);
expect($('#sort-name-desc').hasClass('desc')).to.be(false);
done();
});
list.sort('name', { order: "asc" });
})
});
describe('Search', function() {
it('should trigger searchStart', function(done) {
list.on('searchStart', function() {
done();
});
$('#parse-list .search').val('jon');
fireKeyup($('#parse-list .search')[0]);
});
it('should trigger searchComplete', function(done) {
list.on('searchComplete', function() {
done();
});
$('#parse-list .search').val('jon');
fireKeyup($('#parse-list .search')[0]);
});
});
});
list.js-1.1.1/test/test.create.js 0000664 0000000 0000000 00000004753 12313007001 0016632 0 ustar 00root root 0000000 0000000 describe('Create', function() {
describe('With HTML items', function() {
var listEl = $('');
$(document.body).append(listEl);
var list = new List('list', { valueNames: ['name'] });
it('should contain one item', function() {
expect(list.items.length).to.equal(1);
expect(listEl.find('li').size()).to.equal(1);
});
it('should contain two items', function() {
list.add({ name: 'Jonas' });
expect(list.items.length).to.equal(2);
expect(listEl.find('li').size()).to.equal(2);
});
listEl.remove();
});
describe('Without items and with string template', function() {
var listEl = $('');
$(document.body).append(listEl);
var list = new List('list', {
valueNames: ['name'],
item: ' '
}, [
{ name: 'Jonny' }
]);
it('should contain one item', function() {
expect(list.items.length).to.equal(1);
expect(listEl.find('li').size()).to.equal(1);
});
it('should contain two items', function() {
list.add({ name: 'Jonas' });
expect(list.items.length).to.equal(2);
expect(listEl.find('li').size()).to.equal(2);
});
listEl.remove();
});
describe('Without items and with HTML template', function() {
var listEl = $('');
var templateEl = $(' ');
$(document.body).append(listEl);
$(document.body).append(templateEl);
var list = new List('list', {
valueNames: ['name'],
item: 'template-item'
}, [
{ name: 'Jonny' }
]);
it('should contain one item', function() {
expect(list.items.length).to.equal(1);
expect(listEl.find('li').size()).to.equal(1);
});
it('should contain two items', function() {
list.add({ name: 'Jonas' });
expect(list.items.length).to.equal(2);
expect(listEl.find('li').size()).to.equal(2);
});
listEl.remove();
templateEl.remove();
});
}); list.js-1.1.1/test/test.defaults.js 0000664 0000000 0000000 00000005026 12313007001 0017170 0 ustar 00root root 0000000 0000000 describe('Defaults', function() {
var list;
before(function() {
list = fixture.list(['name'], [ { name: 'Jonny' }]);
});
after(function() {
fixture.removeList();
});
it('should have all default attributes', function() {
expect(list.items).to.be.an('array');
expect(list.visibleItems).to.be.an('array');
expect(list.matchingItems).to.be.an('array');
expect(list.handlers.updated).to.be.an('array');
expect(list.handlers.searchStart).to.be.an('array');
expect(list.handlers.searchComplete).to.be.an('array');
expect(list.handlers.sortStart).to.be.an('array');
expect(list.handlers.sortComplete).to.be.an('array');
expect(list.handlers.filterStart).to.be.an('array');
expect(list.handlers.filterComplete).to.be.an('array');
expect(list.searched).to.be(false);
expect(list.filtered).to.be(false);
expect(list.i).to.equal(1);
expect(list.page).to.equal(200);
expect(list.listClass).to.equal('list');
expect(list.sortClass).to.equal('sort');
expect(list.searchClass).to.equal('search');
expect(list.page).to.equal(200);
});
it('should have the right elements', function() {
expect(list.list).to.equal($('.list')[0]);
expect(list.listContainer).to.equal($('#list')[0]);
});
it('should have all default methods', function() {
expect(list.add).to.be.a('function');
expect(list.remove).to.be.a('function');
expect(list.get).to.be.a('function');
expect(list.sort).to.be.a('function');
expect(list.search).to.be.a('function');
expect(list.clear).to.be.a('function');
expect(list.filter).to.be.a('function');
expect(list.size).to.be.a('function');
expect(list.show).to.be.a('function');
expect(list.update).to.be.a('function');
expect(list.on).to.be.a('function');
});
it('should have all helper methods', function() {
expect(list.helpers.classes).to.be.a('function');
expect(list.helpers.getAttribute).to.be.a('function');
expect(list.helpers.getByClass).to.be.a('function');
expect(list.helpers.naturalSort).to.be.a('function');
expect(list.helpers.events.bind).to.be.a('function');
expect(list.helpers.events.unbind).to.be.a('function');
expect(list.helpers.extend).to.be.a('function');
expect(list.helpers.indexOf).to.be.a('function');
expect(list.helpers.toString).to.be.a('function');
});
});
list.js-1.1.1/test/test.filter.js 0000664 0000000 0000000 00000007376 12313007001 0016660 0 ustar 00root root 0000000 0000000 describe('Filter', function() {
var list, jonny, martina, angelica, sebastian, imma, hasse;
before(function() {
list = fixture.list(['name', 'born'], fixture.all);
jonny = list.get('name', 'Jonny Strömberg')[0];
martina = list.get('name', 'Martina Elm')[0];
angelica = list.get('name', 'Angelica Abraham')[0];
sebastian = list.get('name', 'Sebastian Höglund')[0];
imma = list.get('name', 'Imma Grafström')[0];
hasse = list.get('name', 'Hasse Strömberg')[0];
});
after(function() {
fixture.removeList();
});
afterEach(function() {
list.filter();
list.show(1, 200);
});
describe('Basics', function() {
it('should return everyone born after 1988', function() {
var result = list.filter(function(item) {
return (item.values().born > 1988);
});
expect(result.length).to.equal(1);
expect(result[0]).to.eql(sebastian);
});
it('should return everyone born 1986', function() {
var result = list.filter(function(item) {
return (item.values().born == 1986);
});
expect(result.length).to.equal(3);
for (var i = 0; i < result.length; i++) {
expect(result[i].values().born).to.equal('1986');
}
});
});
describe('Show and pages', function() {
it('should return the visible items', function() {
list.show(1,2);
var result = list.filter(function(item) {
return (item.values().born > 1985);
});
expect(result).to.eql(list.visibleItems);
});
it('should return be 2 visible items and 3 matching', function() {
list.show(1,2);
var result = list.filter(function(item) {
return (item.values().born > 1985);
});
expect(result.length).to.equal(2);
expect(list.visibleItems.length).to.equal(2);
expect(list.matchingItems.length).to.equal(4);
});
describe('Specific items', function() {
beforeEach(function() {
list.show(1,2);
var result = list.filter(function(item) {
return (item.values().born > 1985);
});
});
it('should match jonny', function() {
expect(jonny.matching()).to.be(true);
expect(jonny.filtered).to.be(true);
expect(jonny.visible()).to.be(true);
});
it('should match martina', function() {
expect(martina.matching()).to.be(true);
expect(martina.filtered).to.be(true);
expect(martina.visible()).to.be(true);
});
it('should match but not show angelica', function() {
expect(angelica.matching()).to.be(true);
expect(angelica.filtered).to.be(true);
expect(angelica.visible()).to.be(false);
});
it('should match but not show sebastian', function() {
expect(sebastian.matching()).to.be(true);
expect(sebastian.filtered).to.be(true);
expect(sebastian.visible()).to.be(false);
});
it('should not match imma', function() {
expect(imma.matching()).to.be(false);
expect(imma.filtered).to.be(false);
expect(imma.visible()).to.be(false);
});
it('should not match hasse', function() {
expect(hasse.matching()).to.be(false);
expect(hasse.filtered).to.be(false);
expect(hasse.visible()).to.be(false);
});
});
});
});
list.js-1.1.1/test/test.item.js 0000664 0000000 0000000 00000012074 12313007001 0016320 0 ustar 00root root 0000000 0000000 describe('Item', function() {
var list, item;
before(function() {
list = fixture.list(['name', 'born', 'doin'], [{
name: "Jonny",
born: "1986",
doin: "Living the dream"
}]);
item = list.get('name', 'Jonny')[0];
});
beforeEach(function() {
list.search();
list.filter();
list.show(1,200);
});
after(function() {
fixture.removeList();
});
describe('Defaults', function() {
it('should have all default attributes', function() {
expect(item.found).to.be(false);
expect(item.filtered).to.be(false);
});
it('should have the right elements', function() {
expect(item.elm).to.equal($('#list li')[0]);
});
it('should have all default methods', function() {
expect(item.hide).to.be.a('function');
expect(item.show).to.be.a('function');
expect(item.values).to.be.a('function');
expect(item.matching).to.be.a('function');
expect(item.visible).to.be.a('function');
});
});
describe('Values()', function() {
it('should have the right values', function() {
expect(item.values()).to.eql({
name: 'Jonny',
born: '1986',
doin: 'Living the dream'
});
});
it('should be able to change one value', function() {
expect(item.values().name).to.be.equal('Jonny');
item.values({ name: 'Egon' });
expect(item.values().name).to.be.equal('Egon');
});
it('should be able to change many value', function() {
expect(item.values()).to.eql({
name: 'Egon',
born: '1986',
doin: 'Living the dream'
});
item.values({
name: 'Sven',
born: '1801',
doin: 'Is dead'
});
expect(item.values()).to.eql({
name: 'Sven',
born: '1801',
doin: 'Is dead'
});
});
});
describe('Hide, show, visible', function() {
it('should be hidden', function() {
expect($('#list li').size()).to.equal(1);
item.hide();
expect(item.visible()).to.be(false);
expect($('#list li').size()).to.equal(0);
});
it('should be visible', function() {
item.hide();
expect($('#list li').size()).to.equal(0);
item.show();
expect(item.visible()).to.be(true);
expect($('#list li').size()).to.equal(1);
});
});
describe('Matching, found, filtered', function() {
describe('Searching', function() {
it('should not be visible, match, found or filtered', function() {
list.search('Fredrik');
expect(item.matching()).to.be(false);
expect(item.found).to.be(false);
expect(item.filtered).to.be(false);
expect(item.visible()).to.be(false);
});
it('should be visble, match and found but not filterd', function() {
var result = list.search('Sven');
expect(item.matching()).to.be(true);
expect(item.found).to.be(true);
expect(item.filtered).to.be(false);
expect(item.visible()).to.be(true);
});
it('reset: should be visible and matching but not found or filtered', function() {
list.search();
expect(item.matching()).to.be(true);
expect(item.found).to.be(false);
expect(item.filtered).to.be(false);
expect(item.visible()).to.be(true);
});
});
describe('Filtering', function() {
it('should not be visble, match, found or filtered', function() {
list.filter(function(item) {
return (item.values().name == "Fredrik");
});
expect(item.matching()).to.be(false);
expect(item.found).to.be(false);
expect(item.filtered).to.be(false);
expect(item.visible()).to.be(false);
});
it('should be visble, match and filtered but not found', function() {
list.filter(function(item) {
return (item.values().name == "Sven");
});
expect(item.matching()).to.be(true);
expect(item.found).to.be(false);
expect(item.filtered).to.be(true);
expect(item.visible()).to.be(true);
});
it('reset: should be visble and match but not filtered or found', function() {
list.filter();
expect(item.matching()).to.be(true);
expect(item.found).to.be(false);
expect(item.filtered).to.be(false);
expect(item.visible()).to.be(true);
});
});
});
fixture.removeList();
});
list.js-1.1.1/test/test.off.js 0000664 0000000 0000000 00000002410 12313007001 0016125 0 ustar 00root root 0000000 0000000 describe('Off', function() {
var list;
before(function() {
list = fixture.list(['name', 'born'], fixture.all);
});
after(function() {
fixture.removeList();
});
describe('General', function() {
it('should be remove added handler', function(done) {
var updated = function(list) {
expect(list.handlers.updated.length).to.equal(1);
list.off('updated', updated);
expect(list.handlers.updated.length).to.equal(0);
done();
};
list.on('updated', updated);
list.search('jonny');
});
it('should not remove unnamed handlers', function(done) {
var searchComplete = function(list) {
expect(list.handlers.searchComplete.length).to.equal(3);
list.off('searchComplete', function() {});
list.off('searchComplete', searchComplete);
expect(list.handlers.searchComplete.length).to.equal(2);
done();
};
list.on('searchComplete', function() {});
list.on('searchComplete', searchComplete);
list.on('searchComplete', function() {});
list.search('jonny');
});
});
});
list.js-1.1.1/test/test.on.js 0000664 0000000 0000000 00000006620 12313007001 0015776 0 ustar 00root root 0000000 0000000 describe('On', function() {
var list;
beforeEach(function() {
list = fixture.list(['name', 'born'], fixture.all);
});
afterEach(function() {
fixture.removeList();
});
describe('Updated', function() {
it('should be triggered after search', function(done) {
list.on('updated', function(list) {
done();
});
list.search('jonny');
});
it('should be triggered after sort', function(done) {
list.on('updated', function(list) {
done();
});
list.sort('name');
});
it('should be triggered after filter', function(done) {
list.on('updated', function(list) {
done();
});
list.filter(function() {
return true;
});
});
it('should be triggered after show', function(done) {
list.on('updated', function(list) {
done();
});
list.show(1,10);
});
it('should be triggered after add', function(done) {
list.on('updated', function(list) {
done();
});
list.add({ name: 'Hej' });
});
it('should be triggered after remove', function(done) {
list.on('updated', function(list) {
done();
});
list.remove('name', 'Jonny');
});
});
describe('Multiple handlers', function() {
it('should be trigger both handlers', function(done) {
var done1 = false,
done2 = false,
isDone = function() {
if (done1 && done2) {
done();
}
};
list.on('updated', function(list) {
done1 = true;
isDone();
});
list.on('updated', function(list) {
done2 = true;
isDone();
});
list.search('jonny');
});
});
describe('Search', function() {
it('should be triggered before and after search', function(done) {
var done1 = false;
list.on('searchStart', function(list) {
done1 = true;
});
list.on('searchComplete', function(list) {
if (done1) {
done();
}
});
list.search('jonny');
});
});
describe('Sort', function() {
it('should be triggered before and after sort', function(done) {
var done1 = false;
list.on('sortStart', function(list) {
done1 = true;
});
list.on('sortComplete', function(list) {
if (done1) {
done();
}
});
list.sort('name');
});
});
describe('Filter', function() {
it('should be triggered before and after filter', function(done) {
var done1 = false;
list.on('filterStart', function(list) {
done1 = true;
});
list.on('filterComplete', function(list) {
if (done1) {
done();
}
});
list.filter(function() {
return true;
});
});
});
});
list.js-1.1.1/test/test.parse.js 0000664 0000000 0000000 00000003652 12313007001 0016476 0 ustar 00root root 0000000 0000000 describe('Parse', function() {
var list;
before(function() {
$('body').append($(''));
list = new List('parse-list', {
valueNames: ['name', 'born']
});
});
after(function() {
$('#parse-list').remove();
});
describe('Parse', function() {
it('should have two items', function() {
expect(list.items.length).to.equal(2);
expect(list.items[0].values().name).to.equal("Jonny");
expect(list.items[1].values().name).to.equal("Jocke");
});
it('should add item to parsed list', function() {
list.add({ name: "Sven", born: 1950 });
expect(list.items.length).to.equal(3);
expect(list.items[0].values().name).to.equal("Jonny");
expect(list.items[1].values().name).to.equal("Jocke");
expect(list.items[2].values().name).to.equal("Sven");
expect(list.items[0].values().born).to.equal("1986");
expect(list.items[2].values().born).to.equal(1950);
var el = $($('#parse-list').find('.list div')[2]);
expect(el.find('span').size()).to.equal(2);
expect(el.find('span.name').text()).to.equal('Sven');
expect(el.find('span.born').text()).to.equal('1950');
});
it('should parsed value always be string while added could be number', function() {
expect(list.items[0].values().born).to.equal("1986");
expect(list.items[0].values().born).not.to.equal(1986);
expect(list.items[2].values().born).not.to.equal("1950");
expect(list.items[2].values().born).to.equal(1950);
});
});
});
list.js-1.1.1/test/test.search-filter.js 0000664 0000000 0000000 00000004730 12313007001 0020112 0 ustar 00root root 0000000 0000000 describe('Search and filter', function() {
var list, jonny, martina, angelica, sebastian, imma, hasse;
before(function() {
list = fixture.list(['name', 'born'], fixture.all);
jonny = list.get('name', 'Jonny Strömberg')[0];
martina = list.get('name', 'Martina Elm')[0];
angelica = list.get('name', 'Angelica Abraham')[0];
sebastian = list.get('name', 'Sebastian Höglund')[0];
imma = list.get('name', 'Imma Grafström')[0];
hasse = list.get('name', 'Hasse Strömberg')[0];
});
after(function() {
fixture.removeList();
});
afterEach(function() {
list.search();
list.filter();
});
describe('Search with filter', function() {
it('should find everyone born 1986', function() {
list.filter(function(item) {
return (item.values().born == '1986');
});
expect(list.matchingItems.length).to.equal(3);
expect(jonny.matching()).to.be(true);
expect(martina.matching()).to.be(true);
expect(angelica.matching()).to.be(true);
expect(sebastian.matching()).to.be(false);
expect(imma.matching()).to.be(false);
expect(hasse.matching()).to.be(false);
});
it('should find everyone born 1986 and containes "ö"', function() {
list.filter(function(item) {
return (item.values().born == '1986');
});
list.search('ö');
expect(list.matchingItems.length).to.equal(1);
expect(jonny.matching()).to.be(true);
expect(martina.matching()).to.be(false);
expect(angelica.matching()).to.be(false);
expect(sebastian.matching()).to.be(false);
expect(imma.matching()).to.be(false);
expect(hasse.matching()).to.be(false);
});
it('should find everyone with a "ö"', function() {
list.filter(function(item) {
return (item.values().born == '1986');
});
list.search('ö');
list.filter();
expect(list.matchingItems.length).to.equal(4);
expect(jonny.matching()).to.be(true);
expect(martina.matching()).to.be(false);
expect(angelica.matching()).to.be(false);
expect(sebastian.matching()).to.be(true);
expect(imma.matching()).to.be(true);
expect(hasse.matching()).to.be(true);
});
});
});
list.js-1.1.1/test/test.search.js 0000664 0000000 0000000 00000011463 12313007001 0016630 0 ustar 00root root 0000000 0000000 describe('Search', function() {
var list, jonny, martina, angelica, sebastian, imma, hasse;
beforeEach(function() {
list = fixture.list(['name', 'born'], fixture.all);
jonny = list.get('name', 'Jonny Strömberg')[0];
martina = list.get('name', 'Martina Elm')[0];
angelica = list.get('name', 'Angelica Abraham')[0];
sebastian = list.get('name', 'Sebastian Höglund')[0];
imma = list.get('name', 'Imma Grafström')[0];
hasse = list.get('name', 'Hasse Strömberg')[0];
});
afterEach(function() {
fixture.removeList();
});
describe('Case-sensitive', function() {
it('should not be case-sensitive', function() {
var result = list.search('jonny');
expect(result.length).to.equal(1);
expect(result[0]).to.eql(jonny);
});
});
describe('Number of results', function() {
it('should find jonny, martina, angelice', function() {
var result = list.search('1986');
expect(result.length).to.equal(3); // 3!!
expect(jonny.matching()).to.be(true);
expect(martina.matching()).to.be(true);
expect(angelica.matching()).to.be(true);
expect(sebastian.matching()).to.be(false);
expect(imma.matching()).to.be(false);
expect(hasse.matching()).to.be(false);
});
it('should find all with utf-8 char ö', function() {
var result = list.search('ö');
expect(result.length).to.equal(4); // 4!!
expect(jonny.matching()).to.be(true);
expect(martina.matching()).to.be(false);
expect(angelica.matching()).to.be(false);
expect(sebastian.matching()).to.be(true);
expect(imma.matching()).to.be(true);
expect(hasse.matching()).to.be(true);
});
it('should not break with weird searches', function() {
expect(list.search).withArgs(undefined).to.not.throwException();
expect(list.search).withArgs(null).to.not.throwException();
expect(list.search).withArgs(0).to.not.throwException();
expect(list.search).withArgs(function() {}).to.not.throwException();
expect(list.search).withArgs({ foo: "bar" }).to.not.throwException();
});
it('should not break with weird values', function() {
jonny.values({ name: undefined });
martina.values({ name: null });
angelica.values({ name: 0 });
sebastian.values({ name: function() {} });
imma.values({ name: { foo: "bar" } });
expect(list.search).withArgs("jonny").to.not.throwException();
expect(list.search).withArgs(undefined).to.not.throwException();
expect(list.search).withArgs(null).to.not.throwException();
expect(list.search).withArgs(0).to.not.throwException();
expect(list.search).withArgs(function() {}).to.not.throwException();
expect(list.search).withArgs({ foo: "bar" }).to.not.throwException();
});
});
describe('Specfic columns', function() {
it('should find match in column', function() {
var result = list.search('jonny', [ 'name' ]);
expect(result.length).to.equal(1);
expect(result[0]).to.eql(jonny);
});
it('should not find match in column', function() {
var result = list.search('jonny', [ 'born' ]);
expect(result.length).to.equal(0);
});
it('should find match in column', function() {
var result = list.search('jonny', [ 'name' ]);
expect(result.length).to.equal(1);
expect(result[0]).to.eql(jonny);
});
it('should not find match in column', function() {
var result = list.search('jonny', [ 'born' ]);
expect(result.length).to.equal(0);
});
it('should work with columns that does not exist', function() {
var result = list.search('jonny', [ 'pet' ]);
expect(result.length).to.equal(0);
});
});
describe('Custom search function', function() {
var customSearchFunction = function(searchString, columns) {
for (var k = 0, kl = list.items.length; k < kl; k++) {
if (list.items[k].values().born > 1985) {
list.items[k].found = true;
}
}
};
it('should use custom function in third argument', function() {
var result = list.search('jonny', [ 'name' ], customSearchFunction);
expect(result.length).to.equal(4);
});
it('should use custom function in second argument', function() {
var result = list.search('jonny', customSearchFunction);
expect(result.length).to.equal(4);
});
});
});
list.js-1.1.1/test/test.show.js 0000664 0000000 0000000 00000017017 12313007001 0016344 0 ustar 00root root 0000000 0000000 describe('Show', function() {
var list, a, b, c, d, e, f;
before(function() {
list = fixture.list(['id'], [
{ id: "1", id2: "a" },
{ id: "2", id2: "a" },
{ id: "3", id2: "b" },
{ id: "4", id2: "b" },
{ id: "5", id2: "bc" },
{ id: "6", id2: "bc" }
]);
a = list.get('id', '1')[0];
b = list.get('id', '2')[0];
c = list.get('id', '3')[0];
d = list.get('id', '4')[0];
e = list.get('id', '5')[0];
f = list.get('id', '6')[0];
});
after(function() {
fixture.removeList();
});
afterEach(function() {
list.filter();
list.show(1, 200);
});
describe('Basics', function() {
it('should be 1, 2', function() {
list.show(1,2);
expect(list.visibleItems.length).to.equal(2);
expect(a.visible()).to.be(true);
expect(b.visible()).to.be(true);
expect(c.visible()).to.be(false);
expect(d.visible()).to.be(false);
expect(e.visible()).to.be(false);
expect(f.visible()).to.be(false);
});
it('should show item 6', function() {
list.show(6,2);
expect(list.visibleItems.length).to.equal(1);
expect(a.visible()).to.be(false);
expect(b.visible()).to.be(false);
expect(c.visible()).to.be(false);
expect(d.visible()).to.be(false);
expect(e.visible()).to.be(false);
expect(f.visible()).to.be(true);
});
it('should show item 1, 2, 3, 4, 5, 6', function() {
list.show(1,200);
expect(list.visibleItems.length).to.equal(6);
expect(a.visible()).to.be(true);
expect(b.visible()).to.be(true);
expect(c.visible()).to.be(true);
expect(d.visible()).to.be(true);
expect(e.visible()).to.be(true);
expect(f.visible()).to.be(true);
});
it('should show item 3, 4, 5', function() {
list.show(3,3);
expect(list.visibleItems.length).to.equal(3);
expect(a.visible()).to.be(false);
expect(b.visible()).to.be(false);
expect(c.visible()).to.be(true);
expect(d.visible()).to.be(true);
expect(e.visible()).to.be(true);
expect(f.visible()).to.be(false);
});
it('should show item 5, 6', function() {
list.show(5,3);
expect(list.visibleItems.length).to.equal(2);
expect(a.visible()).to.be(false);
expect(b.visible()).to.be(false);
expect(c.visible()).to.be(false);
expect(d.visible()).to.be(false);
expect(e.visible()).to.be(true);
expect(f.visible()).to.be(true);
});
});
describe('Search', function() {
afterEach(function() {
list.search();
});
it('should show 3, 4', function() {
list.search('b');
list.show(1,2);
expect(list.visibleItems.length).to.equal(2);
expect(a.visible()).to.be(false);
expect(b.visible()).to.be(false);
expect(c.visible()).to.be(true);
expect(d.visible()).to.be(true);
expect(e.visible()).to.be(false);
expect(f.visible()).to.be(false);
});
it('should show item 3,4,5,6', function() {
list.search('b');
list.show(1,4);
expect(list.visibleItems.length).to.equal(4);
expect(a.visible()).to.be(false);
expect(b.visible()).to.be(false);
expect(c.visible()).to.be(true);
expect(d.visible()).to.be(true);
expect(e.visible()).to.be(true);
expect(f.visible()).to.be(true);
});
it('should not show any items but match two', function() {
list.search('a');
list.show(3,2);
expect(list.visibleItems.length).to.equal(0);
expect(list.matchingItems.length).to.equal(2);
expect(a.visible()).to.be(false);
expect(b.visible()).to.be(false);
expect(c.visible()).to.be(false);
expect(d.visible()).to.be(false);
expect(e.visible()).to.be(false);
expect(f.visible()).to.be(false);
});
});
describe('Filter', function() {
afterEach(function() {
list.filter();
});
it('should show 3, 4', function() {
list.filter(function(item) {
return (item.values().id2 == 'b');
});
list.show(1,2);
expect(list.visibleItems.length).to.equal(2);
expect(list.matchingItems.length).to.equal(2);
expect(a.visible()).to.be(false);
expect(b.visible()).to.be(false);
expect(c.visible()).to.be(true);
expect(d.visible()).to.be(true);
expect(e.visible()).to.be(false);
expect(f.visible()).to.be(false);
});
it('should show item 3,4,5,6', function() {
list.filter(function(item) {
return (item.values().id2 == 'bc');
});
list.show(1,4);
expect(list.visibleItems.length).to.equal(2);
expect(list.matchingItems.length).to.equal(2);
expect(a.visible()).to.be(false);
expect(b.visible()).to.be(false);
expect(c.visible()).to.be(false);
expect(d.visible()).to.be(false);
expect(e.visible()).to.be(true);
expect(f.visible()).to.be(true);
});
it('should not show any items but match two', function() {
list.filter(function(item) {
return (item.values().id2 == 'b');
});
list.show(3,2);
expect(list.visibleItems.length).to.equal(0);
expect(list.matchingItems.length).to.equal(2);
expect(a.visible()).to.be(false);
expect(b.visible()).to.be(false);
expect(c.visible()).to.be(false);
expect(d.visible()).to.be(false);
expect(e.visible()).to.be(false);
expect(f.visible()).to.be(false);
});
});
describe('Filter and search', function() {
afterEach(function() {
list.filter();
});
it('should show 4, 5', function() {
list.show(1,2);
list.filter(function(item) {
return (item.values().id > '3');
});
list.search('b');
expect(list.visibleItems.length).to.equal(2);
expect(list.matchingItems.length).to.equal(3);
expect(a.visible()).to.be(false);
expect(b.visible()).to.be(false);
expect(c.visible()).to.be(false);
expect(d.visible()).to.be(true);
expect(e.visible()).to.be(true);
expect(f.visible()).to.be(false);
});
it('should show 5, 6', function() {
list.show(1,2);
list.filter(function(item) {
return (item.values().id > '3');
});
list.search('b');
list.show(2,2);
expect(list.visibleItems.length).to.equal(2);
expect(list.matchingItems.length).to.equal(3);
expect(a.visible()).to.be(false);
expect(b.visible()).to.be(false);
expect(c.visible()).to.be(false);
expect(d.visible()).to.be(false);
expect(e.visible()).to.be(true);
expect(f.visible()).to.be(true);
});
});
});
list.js-1.1.1/test/test.sort.js 0000664 0000000 0000000 00000036654 12313007001 0016363 0 ustar 00root root 0000000 0000000 describe('Sort', function() {
var list, i1, i2, i3, i4, i5, i6;
beforeEach(function() {
list = fixture.list(['id'], [
{ id: "1", val: "" },
{ id: "2", val: "" },
{ id: "3", val: "" },
{ id: "4", val: "" },
{ id: "5", val: "" },
{ id: "6", val: "" }
]);
i1 = list.get('id', '1')[0];
i2 = list.get('id', '2')[0];
i3 = list.get('id', '3')[0];
i4 = list.get('id', '4')[0];
i5 = list.get('id', '5')[0];
i6 = list.get('id', '6')[0];
});
afterEach(function() {
fixture.removeList();
});
describe('Basics', function() {
it('should sort letters asc', function() {
i1.values({ val: "b" });
i2.values({ val: "a" });
i3.values({ val: "c" });
i4.values({ val: "z" });
i5.values({ val: "s" });
i6.values({ val: "y" });
list.sort('val');
expect(list.items[0].values().val).to.be.equal("a");
expect(list.items[1].values().val).to.be.equal("b");
expect(list.items[2].values().val).to.be.equal("c");
expect(list.items[3].values().val).to.be.equal("s");
expect(list.items[4].values().val).to.be.equal("y");
expect(list.items[5].values().val).to.be.equal("z");
});
it('should sort letters desc', function() {
i1.values({ val: "b" });
i2.values({ val: "a" });
i3.values({ val: "c" });
i4.values({ val: "z" });
i5.values({ val: "s" });
i6.values({ val: "y" });
list.sort('val', { order: "desc" });
expect(list.items[0].values().val).to.be.equal("z");
expect(list.items[1].values().val).to.be.equal("y");
expect(list.items[2].values().val).to.be.equal("s");
expect(list.items[3].values().val).to.be.equal("c");
expect(list.items[4].values().val).to.be.equal("b");
expect(list.items[5].values().val).to.be.equal("a");
});
it('should fail to sort åäö desc (becomes äåö)', function() {
i1.values({ val: "a" });
i2.values({ val: "å" });
i3.values({ val: "ä" });
i4.values({ val: "ö" });
i5.values({ val: "o" });
i6.values({ val: "s" });
list.sort('val');
expect(list.items[0].values().val).to.be.equal("a");
expect(list.items[1].values().val).to.be.equal("o");
expect(list.items[2].values().val).to.be.equal("s");
expect(list.items[3].values().val).to.be.equal("ä");
expect(list.items[4].values().val).to.be.equal("å");
expect(list.items[5].values().val).to.be.equal("ö");
});
it('should fail to sort åäö asc (becomes öåä)', function() {
i1.values({ val: "a" });
i2.values({ val: "å" });
i3.values({ val: "ä" });
i4.values({ val: "ö" });
i5.values({ val: "o" });
i6.values({ val: "s" });
list.sort('val', { order: "desc" });
expect(list.items[0].values().val).to.be.equal("ö");
expect(list.items[1].values().val).to.be.equal("å");
expect(list.items[2].values().val).to.be.equal("ä");
expect(list.items[3].values().val).to.be.equal("s");
expect(list.items[4].values().val).to.be.equal("o");
expect(list.items[5].values().val).to.be.equal("a");
});
it('should handle case-insensitive by default', function() {
i1.values({ val: "e" });
i2.values({ val: "b" });
i4.values({ val: "F" });
i3.values({ val: "D" });
i5.values({ val: "A" });
i6.values({ val: "C" });
list.sort('val');
expect(list.items[0].values().val).to.be.equal("A");
expect(list.items[1].values().val).to.be.equal("b");
expect(list.items[2].values().val).to.be.equal("C");
expect(list.items[3].values().val).to.be.equal("D");
expect(list.items[4].values().val).to.be.equal("e");
expect(list.items[5].values().val).to.be.equal("F");
});
it('should disable insensitive', function() {
i1.values({ val: "e" });
i2.values({ val: "b" });
i4.values({ val: "F" });
i3.values({ val: "D" });
i5.values({ val: "A" });
i6.values({ val: "C" });
list.sort('val', { insensitive: false });
expect(list.items[0].values().val).to.be.equal("A");
expect(list.items[1].values().val).to.be.equal("C");
expect(list.items[2].values().val).to.be.equal("D");
expect(list.items[3].values().val).to.be.equal("F");
expect(list.items[4].values().val).to.be.equal("b");
expect(list.items[5].values().val).to.be.equal("e");
});
it('should sort dates', function() {
i1.values({ val: "10/12/2008" });
i2.values({ val: "10/11/2008" });
i3.values({ val: "10/11/2007" });
i4.values({ val: "10/12/2009" });
i5.values({ val: "4/01/2007" });
i6.values({ val: "10/12/2006" });
list.sort('val', { order: "asc" });
expect(list.items[0].values().val).to.be.equal("10/12/2006");
expect(list.items[1].values().val).to.be.equal("4/01/2007");
expect(list.items[2].values().val).to.be.equal("10/11/2007");
expect(list.items[3].values().val).to.be.equal("10/11/2008");
expect(list.items[4].values().val).to.be.equal("10/12/2008");
expect(list.items[5].values().val).to.be.equal("10/12/2009");
});
it('should sort file names', function() {
i1.values({ val: "car.mov" });
i2.values({ val: "01alpha.sgi" });
i3.values({ val: "001alpha.sgi" });
i4.values({ val: "my.string_41299.tif" });
i5.values({ val: "0003.zip" });
i6.values({ val: "0002.asp" });
list.sort('val', { order: "asc" });
expect(list.items[0].values().val).to.be.equal("0002.asp");
expect(list.items[1].values().val).to.be.equal("0003.zip");
expect(list.items[2].values().val).to.be.equal("001alpha.sgi");
expect(list.items[3].values().val).to.be.equal("01alpha.sgi");
expect(list.items[4].values().val).to.be.equal("car.mov");
expect(list.items[5].values().val).to.be.equal("my.string_41299.tif");
});
it('should sort floates', function() {
i1.values({ val: "10.0401" });
i2.values({ val: "10.022" });
i3.values({ val: "10.021999" });
i4.values({ val: "11.231" });
i5.values({ val: "0003.123" });
i6.values({ val: "09.2123" });
list.sort('val', { order: "asc" });
expect(list.items[0].values().val).to.be.equal("0003.123");
expect(list.items[1].values().val).to.be.equal("09.2123");
expect(list.items[2].values().val).to.be.equal("10.021999");
expect(list.items[3].values().val).to.be.equal("10.022");
expect(list.items[4].values().val).to.be.equal("10.0401");
expect(list.items[5].values().val).to.be.equal("11.231");
});
it('should sort IP addresses', function() {
i1.values({ val: "192.168.1.1" });
i2.values({ val: "192.168.0.100" });
i3.values({ val: "192.168.0.1" });
i4.values({ val: "192.168.1.3" });
i5.values({ val: "127.0.0.1" });
i6.values({ val: "192.168.1.2" });
list.sort('val', { order: "asc" });
expect(list.items[0].values().val).to.be.equal("127.0.0.1");
expect(list.items[1].values().val).to.be.equal("192.168.0.1");
expect(list.items[2].values().val).to.be.equal("192.168.0.100");
expect(list.items[3].values().val).to.be.equal("192.168.1.1");
expect(list.items[4].values().val).to.be.equal("192.168.1.2");
expect(list.items[5].values().val).to.be.equal("192.168.1.3");
});
it('should not break with weird values', function() {
i1.values({ val: undefined });
i2.values({ val: null });
i3.values({ val: 0 });
i4.values({ val: function() {} });
i5.values({ val: { foo: "bar" } });
expect(list.sort).withArgs('val').to.not.throwException();
expect(list.sort).withArgs('val').to.not.throwException();
expect(list.sort).withArgs('val').to.not.throwException();
expect(list.sort).withArgs('val').to.not.throwException();
expect(list.sort).withArgs('val').to.not.throwException();
expect(list.sort).withArgs('val').to.not.throwException();
});
/*
it('should show how random values are sorted', function() {
list.add({ id: '7', val: "" });
list.add({ id: '8', val: "" });
list.add({ id: '9', val: "" });
list.add({ id: '10', val: "" });
list.add({ id: '11', val: "" });
list.add({ id: '12', val: "" });
var i7 = list.get('id', '7')[0],
i8 = list.get('id', '8')[0],
i9 = list.get('id', '9')[0],
i10 = list.get('id', '10')[0],
i11 = list.get('id', '11')[0],
i12 = list.get('id', '12')[0];
i1.values({ val: undefined });
i2.values({ val: "" });
i3.values({ val: null });
i4.values({ val: "a" });
i5.values({ val: "0" });
i6.values({ val: true });
i7.values({ val: 0 });
i8.values({ val: "z" });
i9.values({ val: "!" });
i10.values({ val: "?" });
i11.values({ val: 100 });
i12.values({ val: false });
list.sort('val', { order: "asc" });
list.sort('val', { order: "desc" });
list.sort('val', { order: "asc" });
expect(list.items[0].values().val).to.be.equal("");
expect(list.items[1].values().val).to.be.equal("0");
expect(list.items[2].values().val).to.be.equal(0);
expect(list.items[3].values().val).to.be.equal(100);
expect(list.items[4].values().val).to.be.equal("!");
expect(list.items[5].values().val).to.be.equal("?");
expect(list.items[6].values().val).to.be.equal("a");
expect(list.items[7].values().val).to.be.equal(false);
expect(list.items[8].values().val).to.be.equal(null);
expect(list.items[9].values().val).to.be.equal(true);
expect(list.items[10].values().val).to.be.equal(undefined);
expect(list.items[11].values().val).to.be.equal("z");
});
it('should handle space and zero the same for desc and asc (random)', function() {
list.clear();
list.add({ val: "" });
list.add({ val: "0" });
list.add({ val: 0 });
list.sort('val', { order: "asc" });
expect(list.items[0].values().val).to.be.equal("");
expect(list.items[1].values().val).to.be.equal("0");
expect(list.items[2].values().val).to.be.equal(0);
list.sort('val', { order: "desc" });
expect(list.items[0].values().val).to.be.equal("");
expect(list.items[1].values().val).to.be.equal("0");
expect(list.items[2].values().val).to.be.equal(0);
list.sort('val', { order: "asc" });
expect(list.items[0].values().val).to.be.equal("");
expect(list.items[1].values().val).to.be.equal("0");
expect(list.items[2].values().val).to.be.equal(0);
});
*/
});
describe('Custom sort function', function() {
it('should use custom sort option', function() {
i1.values({ val: "" });
i2.values({ val: "" });
i3.values({ val: "" });
i4.values({ val: "" });
i5.values({ val: "" });
i6.values({ val: "" });
list.sort('val', {
sortFunction: function(itemA, itemB, options) {
options.desc = false;
return list.helpers.naturalSort($(itemA.values()[options.valueName]).val(), $(itemB.values()[options.valueName]).val(), options);
}
});
expect(list.items[0].values().val).to.be.equal("");
expect(list.items[1].values().val).to.be.equal("");
expect(list.items[2].values().val).to.be.equal("");
expect(list.items[3].values().val).to.be.equal("");
expect(list.items[4].values().val).to.be.equal("");
expect(list.items[5].values().val).to.be.equal("");
});
it('should use default custom sort function', function() {
list.sortFunction = function(itemA, itemB, options) {
options.desc = false;
return list.helpers.naturalSort($(itemA.values()[options.valueName]).val(), $(itemB.values()[options.valueName]).val(), options);
};
i1.values({ val: "" });
i2.values({ val: "" });
i3.values({ val: "" });
i4.values({ val: "" });
i5.values({ val: "" });
i6.values({ val: "" });
list.sort('val');
expect(list.items[0].values().val).to.be.equal("");
expect(list.items[1].values().val).to.be.equal("");
expect(list.items[2].values().val).to.be.equal("");
expect(list.items[3].values().val).to.be.equal("");
expect(list.items[4].values().val).to.be.equal("");
expect(list.items[5].values().val).to.be.equal("");
});
it('should use default custom sort function with options', function() {
list.sortFunction = function(itemA, itemB, options) {
options.desc = true;
return list.helpers.naturalSort($(itemA.values()[options.valueName]).val(), $(itemB.values()[options.valueName]).val(), options);
};
i1.values({ val: "" });
i2.values({ val: "" });
i3.values({ val: "" });
i4.values({ val: "" });
i5.values({ val: "" });
i6.values({ val: "" });
list.sort('val', { order: "desc"});
expect(list.items[0].values().val).to.be.equal("");
expect(list.items[1].values().val).to.be.equal("");
expect(list.items[2].values().val).to.be.equal("");
expect(list.items[3].values().val).to.be.equal("");
expect(list.items[4].values().val).to.be.equal("");
expect(list.items[5].values().val).to.be.equal("");
});
});
});
list.js-1.1.1/test/test.trigger.js 0000664 0000000 0000000 00000000724 12313007001 0017024 0 ustar 00root root 0000000 0000000 describe('Trigger', function() {
var list;
before(function() {
list = fixture.list(['name', 'born'], fixture.all);
});
after(function() {
fixture.removeList();
});
describe('General', function() {
it('should be triggered by searchComplete', function(done) {
list.on('searchComplete', function() {
done();
});
list.trigger('searchComplete');
});
});
});