diff --git a/Gruntfile.js b/Gruntfile.js index f3c4a2d..cebe6ae 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,16 +1,23 @@ module.exports = function(grunt) { + var reducer = (a, c) => a+' * - '+c.name+' <'+c.email+'> ('+c.url+')\n'; + + var pkgConf = grunt.file.readJSON('package.json'); // Project configuration. grunt.initConfig({ - pkg: grunt.file.readJSON('package.json'), + pkg: pkgConf, banner: '/*! \n * <%= pkg.title || pkg.name %> v<%= pkg.version %>\n' + ' * <%= pkg.homepage %>\n' + ' * Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %> <%= pkg.author.url %>\n' + + ' * Contributors\n' + + (pkgConf.contributors.reduce(reducer, '')) + + ' * Maintainers\n' + + (pkgConf.maintainers.reduce(reducer, '')) + ' * License: <%= pkg.license %>\n' + ' */\n', jshint: { all: [ - './src/*.js', '*.js', '*.json' + './src/*.js', '*.js', '*.json', '!Gruntfile.js' ], options: { jshintrc: '.jshintrc' @@ -86,6 +93,9 @@ module.exports = function(grunt) { clean: { temp: { src: [ 'tmp' ] + }, + dist: { + src: [ 'dist' ] } }, bump: { diff --git a/bower.json b/bower.json index e00315d..e00ff44 100644 --- a/bower.json +++ b/bower.json @@ -1,9 +1,10 @@ { "name": "angular-advanced-searchbox", - "version": "3.0.0", - "homepage": "https://github.com/dnauck/angular-advanced-searchbox", + "version": "3.0.4", + "homepage": "https://github.com/marchrius/angular-advanced-searchbox", "authors": [ - "Daniel Nauck " + "Daniel Nauck ", + "Matteo Gaggiano " ], "description": "A directive for AngularJS providing a advanced visual search box", "main": [ @@ -27,9 +28,9 @@ "tests" ], "dependencies": { - "angular": "1", - "jquery": "2", - "bootstrap": "3", - "angular-bootstrap": "1" - } + "angular": "1", + "jquery": "2", + "bootstrap": "3", + "angular-bootstrap": "1" + } } diff --git a/dist/angular-advanced-searchbox-tpls.js b/dist/angular-advanced-searchbox-tpls.js index 3997fbb..203d256 100644 --- a/dist/angular-advanced-searchbox-tpls.js +++ b/dist/angular-advanced-searchbox-tpls.js @@ -20,6 +20,9 @@ angular.module('angular-advanced-searchbox', []) parametersLabel: '@', parametersDisplayLimit: '=?', placeholder: '@', + trashIconClass: '@', + searchIconClass: '@', + plusIconClass: '@', searchThrottleTime: '=?' }, replace: true, @@ -30,6 +33,14 @@ angular.module('angular-advanced-searchbox', []) '$scope', '$attrs', '$element', '$timeout', '$filter', 'setFocusFor', function ($scope, $attrs, $element, $timeout, $filter, setFocusFor) { + $scope.trashIconClass = $scope.trashIconClass || 'glyphicon glyphicon-trash'; + $scope.searchIconClass = $scope.searchIconClass || 'glyphicon glyphicon-search'; + $scope.plusIconClass = $scope.plusIconClass || 'glyphicon glyphicon-plus'; + + function returnAsIs(arg0) { + return arg0; + } + $scope.parametersLabel = $scope.parametersLabel || 'Parameter Suggestions'; $scope.parametersDisplayLimit = $scope.parametersDisplayLimit || 8; $scope.placeholder = $scope.placeholder || 'Search ...'; @@ -165,6 +176,8 @@ angular.module('angular-advanced-searchbox', []) $scope.searchParams.push( { key: searchParam.key, + viewKey: searchParam.viewKey, + viewValue: searchParam.viewValue, name: searchParam.name, type: searchParam.type || 'text', placeholder: searchParam.placeholder, @@ -311,8 +324,52 @@ angular.module('angular-advanced-searchbox', []) searchThrottleTimer = $timeout(function () { angular.forEach(changeBuffer, function (change) { - var searchParam = $filter('filter')($scope.parameters, function (param) { return param.key === key; })[0]; - if(searchParam && searchParam.allowMultiple){ + var searchParam = $filter('filter')($scope.searchParams, function (param) { return param.key === key; })[0]; + var parameter = $filter('filter')($scope.parameters, function (param) { return param.key === key; })[0]; + var viewKeyKey = 'key', viewKey, viewValueKey = 'value', viewValue; + // as Object is related to model and not to configuration + var asObject = parameter && parameter.asObject === true; + var isObject = angular.isObject(change.value); + var isDefined = angular.isDefined(change.value); + var isQueryMode = change.key === 'query' && angular.isUndefined(parameter); + var keyTransFn = !isQueryMode && parameter.keyTransformer && angular.isFunction(parameter.keyTransformer) ? parameter.keyTransformer : returnAsIs; + var valueTransFn = !isQueryMode && parameter.valueTransformer && angular.isFunction(parameter.valueTransformer) ? parameter.valueTransformer : returnAsIs; + var viewKeyTransFn = !isQueryMode && parameter.viewKeyTransformer && angular.isFunction(parameter.viewKeyTransformer) ? parameter.viewKeyTransformer : returnAsIs; + var viewValueTransFn = !isQueryMode && parameter.viewValueTransformer && angular.isFunction(parameter.viewValueTransformer) ? parameter.viewValueTransformer : returnAsIs; + + var value = change.value; + + // activate only if not query mode + if (!isQueryMode) { + if (isDefined) { + if (isObject) { + viewKeyKey = parameter.viewKey; + viewValueKey = parameter.viewValue; + viewValue = value[viewValueKey]; + viewKey = value[viewKeyKey]; + value = asObject ? value : value[viewKeyKey]; + } else { + value = asObject ? { value: value } : value; + } + } + + var transformValue = value; + var transformKey = key; + var transformViewKey = viewKey; + var transformViewValue = viewValue; + + key = keyTransFn(transformKey); + value = valueTransFn(transformValue); + viewKey = viewKeyTransFn(transformViewKey); + viewValue = viewValueTransFn(transformViewValue); + + // restore change model with new properties + change.value = value; + change.key = key; + } + + + if(parameter && parameter.allowMultiple) { if(!angular.isArray($scope.model[change.key])) $scope.model[change.key] = []; @@ -329,6 +386,15 @@ angular.module('angular-advanced-searchbox', []) else $scope.model[change.key] = change.value; } + + if (searchParam) { + searchParam.$$view = { + key: key, + value: value, + viewKey: viewKeyKey, + viewValue: viewValue + }; + } }); changeBuffer.length = 0; @@ -364,6 +430,14 @@ angular.module('angular-advanced-searchbox', []) ] }; }) + .filter('flattenObject', [ + function() { + return function(value, key) { + // suggestedValue[searchParam.viewKey] as suggestedValue[searchParam.viewValue] for suggestedValue in searchParam.suggestedValues | filter:$viewValue + return angular.isObject(value) ? value[key] : value; + }; + } + ]) .directive('setFocusOn', [ function() { return { @@ -444,7 +518,7 @@ angular.module('angular-advanced-searchbox').run(['$templateCache', function($te 'use strict'; $templateCache.put('angular-advanced-searchbox.html', - "
0 || searchQuery.length > 0\" ng-click=removeAll() role=button>
{{searchParam.name}}:
{{searchParam.value}}
{{parametersLabel}}: {{param.name}}
" + "
0 || searchQuery.length > 0\" ng-click=removeAll() role=button>
{{searchParam.name}}:
{{searchParam.$$view.viewValue || searchParam.$$view.value}}
{{parametersLabel}}: {{param.name}}
" ); }]); diff --git a/dist/angular-advanced-searchbox-tpls.min.js b/dist/angular-advanced-searchbox-tpls.min.js index 3ddf561..357ffeb 100644 --- a/dist/angular-advanced-searchbox-tpls.min.js +++ b/dist/angular-advanced-searchbox-tpls.min.js @@ -1,7 +1,12 @@ /*! - * angular-advanced-searchbox v3.0.0 - * https://github.com/dnauck/angular-advanced-searchbox - * Copyright (c) 2016 Nauck IT KG http://www.nauck-it.de/ + * angular-advanced-searchbox v3.0.4 + * https://github.com/marchrius/angular-advanced-searchbox + * Copyright (c) 2018 Nauck IT KG http://www.nauck-it.de/ + * Contributors + * - Matteo Gaggiano (http://www.marchrius.org/) + * Maintainers + * - Matteo Gaggiano (http://www.marchrius.org/) * License: MIT */ -!function(){"use strict";angular.module("angular-advanced-searchbox",[]).directive("nitAdvancedSearchbox",function(){return{restrict:"E",scope:{model:"=ngModel",parameters:"=",parametersLabel:"@",parametersDisplayLimit:"=?",placeholder:"@",searchThrottleTime:"=?"},replace:!0,templateUrl:function(a,b){return b.templateUrl||"angular-advanced-searchbox.html"},controller:["$scope","$attrs","$element","$timeout","$filter","setFocusFor",function(a,b,c,d,e,f){function g(){angular.forEach(a.model,function(b,c){if("query"===c)a.searchQuery=b;else{var d=e("filter")(a.parameters,function(a){return a.key===c})[0];void 0!==d&&a.addSearchParam(d,b,!1)}})}function h(b,c,f,g){j&&d.cancel(j),k=e("filter")(k,function(a){return a.key!==c&&a.index!==f}),k.push({command:b,key:c,index:f,value:g}),j=d(function(){angular.forEach(k,function(b){var d=e("filter")(a.parameters,function(a){return a.key===c})[0];d&&d.allowMultiple?(angular.isArray(a.model[b.key])||(a.model[b.key]=[]),"delete"===b.command?(a.model[b.key].splice(b.index,1),0===a.model[b.key].length&&delete a.model[b.key]):a.model[b.key][b.index]=b.value):"delete"===b.command?delete a.model[b.key]:a.model[b.key]=b.value}),k.length=0,a.$emit("advanced-searchbox:modelUpdated",a.model)},a.searchThrottleTime)}function i(a){if(!a)return 0;try{if("number"==typeof a.selectionStart)return"backward"===a.selectionDirection?a.selectionStart:a.selectionEnd;if(document.selection){a.focus();var b=document.selection.createRange(),c=document.selection.createRange().text.length;return b.moveStart("character",-a.value.length),b.text.length-c}}catch(d){}return 0}a.parametersLabel=a.parametersLabel||"Parameter Suggestions",a.parametersDisplayLimit=a.parametersDisplayLimit||8,a.placeholder=a.placeholder||"Search ...",a.searchThrottleTime=a.searchThrottleTime||1e3,a.searchParams=[],a.searchQuery="",a.setFocusFor=f;var j,k=[];a.$watch("model",function(b,c){if(!angular.equals(b,c)){angular.forEach(a.model,function(b,c){if("query"===c&&a.searchQuery!==b)a.searchQuery=b;else{var d=e("filter")(a.parameters,function(a){return a.key===c})[0],f=e("filter")(a.searchParams,function(a){return a.key===c});if(void 0!==d)if(d.allowMultiple){if(angular.isArray(b)||(b=[b]),b.forEach(function(b,c){if(f.some(function(a){return a.index===c})){var e=f.filter(function(a){return a.index===c});e[0].value!==b&&(e[0].value=b)}else a.addSearchParam(d,b,!1)}),b.length=0;d--){var f=a.searchParams[d];if(!a.model.hasOwnProperty(f.key)){var g=a.searchParams.map(function(a){return a.key}).indexOf(f.key);a.removeSearchParam(g)}}}},!0),a.searchParamValueChanged=function(a){h("change",a.key,a.index,a.value)},a.searchQueryChanged=function(a){h("change","query",0,a)},a.enterEditMode=function(b,c){if(void 0!==b&&b.stopPropagation(),void 0!==c){var d=a.searchParams[c];d.editMode=!0,f("searchParam:"+d.key),a.$emit("advanced-searchbox:enteredEditMode",d)}},a.leaveEditMode=function(b,c){if(void 0!==c){var d=a.searchParams[c];d.editMode=!1,a.$emit("advanced-searchbox:leavedEditMode",d),d.value||a.removeSearchParam(c)}},a.searchQueryTypeaheadOnSelect=function(b){a.addSearchParam(b),a.searchQuery="",h("delete","query",0)},a.searchParamTypeaheadOnSelect=function(b,c){c.value=b,a.searchParamValueChanged(c)},a.isUnsedParameter=function(b){return 0===e("filter")(a.searchParams,function(a){return a.key===b.key&&!a.allowMultiple}).length},a.addSearchParam=function(b,c,f){if(void 0===f&&(f=!0),a.isUnsedParameter(b)){var g=0;b.allowMultiple&&(g=e("filter")(a.searchParams,function(a){return a.key===b.key}).length);var i=a.searchParams.push({key:b.key,name:b.name,type:b.type||"text",placeholder:b.placeholder,allowMultiple:b.allowMultiple||!1,suggestedValues:b.suggestedValues||[],restrictToSuggestedValues:b.restrictToSuggestedValues||!1,index:g,value:c||""})-1;h("add",b.key,g,c),f===!0&&d(function(){a.enterEditMode(void 0,i)},100),a.$emit("advanced-searchbox:addedSearchParam",b)}},a.removeSearchParam=function(b){if(void 0!==b){var c=a.searchParams[b];if(a.searchParams.splice(b,1),c.allowMultiple)for(var d=e("filter")(a.searchParams,function(a){return a.key===c.key}),f=0;f0?a.enterEditMode(void 0,b-1):a.searchParams.length>0?a.enterEditMode(void 0,a.searchParams.length-1):0===a.searchParams.length&&f("searchbox")},a.editNext=function(b){void 0!==b&&(a.leaveEditMode(void 0,b),b'),g=angular.element(''),h="none"===c.css("maxWidth")?c.parent().innerWidth():c.css("maxWidth");c.css("maxWidth",h),angular.forEach(["fontSize","fontFamily","fontWeight","fontStyle","letterSpacing","textTransform","wordSpacing","textIndent","boxSizing","borderLeftWidth","borderRightWidth","borderLeftStyle","borderRightStyle","paddingLeft","paddingRight","marginLeft","marginRight"],function(a){g.css(a,c.css(a))}),angular.element("body").append(f.append(g)),d(),b.model?b.$watch("model",function(){d()}):c.on("keypress keyup keydown focus input propertychange change",function(){d()})}}}])}(),angular.module("angular-advanced-searchbox").run(["$templateCache",function(a){"use strict";a.put("angular-advanced-searchbox.html",'
{{searchParam.name}}:
{{searchParam.value}}
{{parametersLabel}}: {{param.name}}
')}]); \ No newline at end of file + +!function(){"use strict";angular.module("angular-advanced-searchbox",[]).directive("nitAdvancedSearchbox",function(){return{restrict:"E",scope:{model:"=ngModel",parameters:"=",parametersLabel:"@",parametersDisplayLimit:"=?",placeholder:"@",trashIconClass:"@",searchIconClass:"@",plusIconClass:"@",searchThrottleTime:"=?"},replace:!0,templateUrl:function(e,a){return a.templateUrl||"angular-advanced-searchbox.html"},controller:["$scope","$attrs","$element","$timeout","$filter","setFocusFor",function(P,e,a,s,k,t){function x(e){return e}var n;P.trashIconClass=P.trashIconClass||"glyphicon glyphicon-trash",P.searchIconClass=P.searchIconClass||"glyphicon glyphicon-search",P.plusIconClass=P.plusIconClass||"glyphicon glyphicon-plus",P.parametersLabel=P.parametersLabel||"Parameter Suggestions",P.parametersDisplayLimit=P.parametersDisplayLimit||8,P.placeholder=P.placeholder||"Search ...",P.searchThrottleTime=P.searchThrottleTime||1e3,P.searchParams=[],P.searchQuery="",P.setFocusFor=t;var i=[];function c(e,y,a,r){n&&s.cancel(n),(i=k("filter")(i,function(e){return e.key!==y&&e.index!==a})).push({command:e,key:y,index:a,value:r}),n=s(function(){angular.forEach(i,function(e){var a,r,t=k("filter")(P.searchParams,function(e){return e.key===y})[0],n=k("filter")(P.parameters,function(e){return e.key===y})[0],s="key",i=n&&!0===n.asObject,c=angular.isObject(e.value),l=angular.isDefined(e.value),o="query"===e.key&&angular.isUndefined(n),u=!o&&n.keyTransformer&&angular.isFunction(n.keyTransformer)?n.keyTransformer:x,d=!o&&n.valueTransformer&&angular.isFunction(n.valueTransformer)?n.valueTransformer:x,h=!o&&n.viewKeyTransformer&&angular.isFunction(n.viewKeyTransformer)?n.viewKeyTransformer:x,m=!o&&n.viewValueTransformer&&angular.isFunction(n.viewValueTransformer)?n.viewValueTransformer:x,f=e.value;if(!o){l&&(c?(s=n.viewKey,r=f[n.viewValue],a=f[s],f=i?f:f[s]):f=i?{value:f}:f);var v=f,p=a,g=r;y=u(y),f=d(v),a=h(p),r=m(g),e.value=f,e.key=y}n&&n.allowMultiple?(angular.isArray(P.model[e.key])||(P.model[e.key]=[]),"delete"===e.command?(P.model[e.key].splice(e.index,1),0===P.model[e.key].length&&delete P.model[e.key]):P.model[e.key][e.index]=e.value):"delete"===e.command?delete P.model[e.key]:P.model[e.key]=e.value,t&&(t.$$view={key:y,value:f,viewKey:s,viewValue:r})}),i.length=0,P.$emit("advanced-searchbox:modelUpdated",P.model)},P.searchThrottleTime)}P.$watch("model",function(e,a){if(!angular.equals(e,a)){angular.forEach(P.model,function(e,a){if("query"===a&&P.searchQuery!==e)P.searchQuery=e;else{var t=k("filter")(P.parameters,function(e){return e.key===a})[0],n=k("filter")(P.searchParams,function(e){return e.key===a});if(void 0!==t)if(t.allowMultiple){if(angular.isArray(e)||(e=[e]),e.forEach(function(e,a){if(n.some(function(e){return e.index===a})){var r=n.filter(function(e){return e.index===a});r[0].value!==e&&(r[0].value=e)}else P.addSearchParam(t,e,!1)}),e.length'),s=angular.element(''),i="none"===a.css("maxWidth")?a.parent().innerWidth():a.css("maxWidth");function c(){l(function(){-1!==t.indexOf(a[0].type||"text")&&(s.text(a.val()||a.attr("placeholder")),a.css("width",s.outerWidth()+10))})}a.css("maxWidth",i),angular.forEach(["fontSize","fontFamily","fontWeight","fontStyle","letterSpacing","textTransform","wordSpacing","textIndent","boxSizing","borderLeftWidth","borderRightWidth","borderLeftStyle","borderRightStyle","paddingLeft","paddingRight","marginLeft","marginRight"],function(e){s.css(e,a.css(e))}),angular.element("body").append(n.append(s)),c(),e.model?e.$watch("model",function(){c()}):a.on("keypress keyup keydown focus input propertychange change",function(){c()})}}}])}(),angular.module("angular-advanced-searchbox").run(["$templateCache",function(e){"use strict";e.put("angular-advanced-searchbox.html",'
{{searchParam.name}}:
{{searchParam.$$view.viewValue || searchParam.$$view.value}}
{{parametersLabel}}: {{param.name}}
')}]); \ No newline at end of file diff --git a/dist/angular-advanced-searchbox.html b/dist/angular-advanced-searchbox.html index 8210ce2..bf9581b 100644 --- a/dist/angular-advanced-searchbox.html +++ b/dist/angular-advanced-searchbox.html @@ -1,26 +1,27 @@
- + - +
- + -
{{searchParam.name}}:
+
{{searchParam.name}}:
- {{searchParam.value}} + {{searchParam.$$view.viewValue || searchParam.$$view.value}} - {{param.name}} + {{param.name}}
\ No newline at end of file diff --git a/dist/angular-advanced-searchbox.js b/dist/angular-advanced-searchbox.js index 227c295..0544bd8 100644 --- a/dist/angular-advanced-searchbox.js +++ b/dist/angular-advanced-searchbox.js @@ -20,6 +20,9 @@ angular.module('angular-advanced-searchbox', []) parametersLabel: '@', parametersDisplayLimit: '=?', placeholder: '@', + trashIconClass: '@', + searchIconClass: '@', + plusIconClass: '@', searchThrottleTime: '=?' }, replace: true, @@ -30,6 +33,14 @@ angular.module('angular-advanced-searchbox', []) '$scope', '$attrs', '$element', '$timeout', '$filter', 'setFocusFor', function ($scope, $attrs, $element, $timeout, $filter, setFocusFor) { + $scope.trashIconClass = $scope.trashIconClass || 'glyphicon glyphicon-trash'; + $scope.searchIconClass = $scope.searchIconClass || 'glyphicon glyphicon-search'; + $scope.plusIconClass = $scope.plusIconClass || 'glyphicon glyphicon-plus'; + + function returnAsIs(arg0) { + return arg0; + } + $scope.parametersLabel = $scope.parametersLabel || 'Parameter Suggestions'; $scope.parametersDisplayLimit = $scope.parametersDisplayLimit || 8; $scope.placeholder = $scope.placeholder || 'Search ...'; @@ -165,6 +176,8 @@ angular.module('angular-advanced-searchbox', []) $scope.searchParams.push( { key: searchParam.key, + viewKey: searchParam.viewKey, + viewValue: searchParam.viewValue, name: searchParam.name, type: searchParam.type || 'text', placeholder: searchParam.placeholder, @@ -311,8 +324,52 @@ angular.module('angular-advanced-searchbox', []) searchThrottleTimer = $timeout(function () { angular.forEach(changeBuffer, function (change) { - var searchParam = $filter('filter')($scope.parameters, function (param) { return param.key === key; })[0]; - if(searchParam && searchParam.allowMultiple){ + var searchParam = $filter('filter')($scope.searchParams, function (param) { return param.key === key; })[0]; + var parameter = $filter('filter')($scope.parameters, function (param) { return param.key === key; })[0]; + var viewKeyKey = 'key', viewKey, viewValueKey = 'value', viewValue; + // as Object is related to model and not to configuration + var asObject = parameter && parameter.asObject === true; + var isObject = angular.isObject(change.value); + var isDefined = angular.isDefined(change.value); + var isQueryMode = change.key === 'query' && angular.isUndefined(parameter); + var keyTransFn = !isQueryMode && parameter.keyTransformer && angular.isFunction(parameter.keyTransformer) ? parameter.keyTransformer : returnAsIs; + var valueTransFn = !isQueryMode && parameter.valueTransformer && angular.isFunction(parameter.valueTransformer) ? parameter.valueTransformer : returnAsIs; + var viewKeyTransFn = !isQueryMode && parameter.viewKeyTransformer && angular.isFunction(parameter.viewKeyTransformer) ? parameter.viewKeyTransformer : returnAsIs; + var viewValueTransFn = !isQueryMode && parameter.viewValueTransformer && angular.isFunction(parameter.viewValueTransformer) ? parameter.viewValueTransformer : returnAsIs; + + var value = change.value; + + // activate only if not query mode + if (!isQueryMode) { + if (isDefined) { + if (isObject) { + viewKeyKey = parameter.viewKey; + viewValueKey = parameter.viewValue; + viewValue = value[viewValueKey]; + viewKey = value[viewKeyKey]; + value = asObject ? value : value[viewKeyKey]; + } else { + value = asObject ? { value: value } : value; + } + } + + var transformValue = value; + var transformKey = key; + var transformViewKey = viewKey; + var transformViewValue = viewValue; + + key = keyTransFn(transformKey); + value = valueTransFn(transformValue); + viewKey = viewKeyTransFn(transformViewKey); + viewValue = viewValueTransFn(transformViewValue); + + // restore change model with new properties + change.value = value; + change.key = key; + } + + + if(parameter && parameter.allowMultiple) { if(!angular.isArray($scope.model[change.key])) $scope.model[change.key] = []; @@ -329,6 +386,15 @@ angular.module('angular-advanced-searchbox', []) else $scope.model[change.key] = change.value; } + + if (searchParam) { + searchParam.$$view = { + key: key, + value: value, + viewKey: viewKeyKey, + viewValue: viewValue + }; + } }); changeBuffer.length = 0; @@ -364,6 +430,14 @@ angular.module('angular-advanced-searchbox', []) ] }; }) + .filter('flattenObject', [ + function() { + return function(value, key) { + // suggestedValue[searchParam.viewKey] as suggestedValue[searchParam.viewValue] for suggestedValue in searchParam.suggestedValues | filter:$viewValue + return angular.isObject(value) ? value[key] : value; + }; + } + ]) .directive('setFocusOn', [ function() { return { diff --git a/dist/angular-advanced-searchbox.min.css b/dist/angular-advanced-searchbox.min.css index 29b9198..29b2f8e 100644 --- a/dist/angular-advanced-searchbox.min.css +++ b/dist/angular-advanced-searchbox.min.css @@ -1,8 +1 @@ -/*! - * angular-advanced-searchbox v3.0.0 - * https://github.com/dnauck/angular-advanced-searchbox - * Copyright (c) 2016 Nauck IT KG http://www.nauck-it.de/ - * License: MIT - */ - -.advancedSearchBox{display:block;position:relative;margin:5px 0 10px;border:1px solid #ccc;border-radius:4px;-webkit-border-radius:4px;-moz-border-radius:4px;min-height:40px;padding:0 9px;background-color:#fff;cursor:text;line-height:38px}.advancedSearchBox.active{border-color:#66afe9}.advancedSearchBox .search-icon{float:right;padding:10px 0 0 10px}.advancedSearchBox .remove-all-icon{float:right;padding:10px 0 0 10px;cursor:pointer}.advancedSearchBox .search-parameter{display:inline-block;height:24px;margin:0 7px 0 0;background-color:#5bc0de;padding:0 5px;border-radius:4px;-webkit-border-radius:4px;-moz-border-radius:4px;line-height:24px;cursor:default;transition:box-shadow 100ms linear}.advancedSearchBox .search-parameter:hover{box-shadow:0 3px 3px rgba(0,0,0,.2)}.advancedSearchBox .search-parameter div{float:left;margin:0 2px}.advancedSearchBox .search-parameter .remove{color:#fff;margin-left:5px;cursor:pointer}.advancedSearchBox .search-parameter .key,.advancedSearchBox .search-parameter .value span{color:#fff}.advancedSearchBox .search-parameter .value input{height:24px}.advancedSearchBox .search-parameter-input{display:inline-block;width:auto;height:24px;border:0;margin:0;padding:0}.advancedSearchBox .search-parameter-input:focus{box-shadow:none;outline:0}.advancedSearchBox .search-parameter-suggestions{cursor:auto;display:block}.advancedSearchBox .search-parameter-suggestions .title{display:block;float:left;height:25px;margin:7px 7px 0 0;background-color:transparent;color:#888;font-weight:700;padding:0 5px;font-size:14px;line-height:25px}.advancedSearchBox .search-parameter-suggestions .search-parameter{cursor:pointer;background-color:#bdbdbd;color:#fff} \ No newline at end of file +.advancedSearchBox{display:block;position:relative;margin:5px 0 10px 0;border:1px solid #ccc;border-radius:4px;-webkit-border-radius:4px;-moz-border-radius:4px;min-height:40px;padding:0 9px;background-color:#fff;cursor:text;line-height:38px}.advancedSearchBox.active{border-color:#66afe9}.advancedSearchBox .search-icon{float:right;padding:10px 0 0 10px}.advancedSearchBox .remove-all-icon{float:right;padding:10px 0 0 10px;cursor:pointer}.advancedSearchBox .search-parameter{display:inline-block;height:24px;margin:0 7px 0 0;background-color:#5bc0de;padding:0 5px;border-radius:4px;-webkit-border-radius:4px;-moz-border-radius:4px;line-height:24px;cursor:default;transition:box-shadow .1s linear}.advancedSearchBox .search-parameter:hover{box-shadow:0 3px 3px rgba(0,0,0,.2)}.advancedSearchBox .search-parameter div{float:left;margin:0 2px}.advancedSearchBox .search-parameter .remove{color:#fff;margin-left:5px;cursor:pointer}.advancedSearchBox .search-parameter .key{color:#fff}.advancedSearchBox .search-parameter .value span{color:#fff}.advancedSearchBox .search-parameter .value input{height:24px}.advancedSearchBox .search-parameter-input{display:inline-block;width:auto;height:24px;border:0;margin:0;padding:0}.advancedSearchBox .search-parameter-input:focus{box-shadow:none;outline:0}.advancedSearchBox .search-parameter-suggestions{cursor:auto;display:block}.advancedSearchBox .search-parameter-suggestions .title{display:block;float:left;height:25px;margin:7px 7px 0 0;background-color:transparent;color:#888;font-weight:700;padding:0 5px;font-size:14px;line-height:25px}.advancedSearchBox .search-parameter-suggestions .search-parameter{cursor:pointer;background-color:#bdbdbd;color:#fff} \ No newline at end of file diff --git a/dist/angular-advanced-searchbox.min.js b/dist/angular-advanced-searchbox.min.js index 6ee2321..8aabe92 100644 --- a/dist/angular-advanced-searchbox.min.js +++ b/dist/angular-advanced-searchbox.min.js @@ -1,7 +1,12 @@ /*! - * angular-advanced-searchbox v3.0.0 - * https://github.com/dnauck/angular-advanced-searchbox - * Copyright (c) 2016 Nauck IT KG http://www.nauck-it.de/ + * angular-advanced-searchbox v3.0.4 + * https://github.com/marchrius/angular-advanced-searchbox + * Copyright (c) 2018 Nauck IT KG http://www.nauck-it.de/ + * Contributors + * - Matteo Gaggiano (http://www.marchrius.org/) + * Maintainers + * - Matteo Gaggiano (http://www.marchrius.org/) * License: MIT */ -!function(){"use strict";angular.module("angular-advanced-searchbox",[]).directive("nitAdvancedSearchbox",function(){return{restrict:"E",scope:{model:"=ngModel",parameters:"=",parametersLabel:"@",parametersDisplayLimit:"=?",placeholder:"@",searchThrottleTime:"=?"},replace:!0,templateUrl:function(a,b){return b.templateUrl||"angular-advanced-searchbox.html"},controller:["$scope","$attrs","$element","$timeout","$filter","setFocusFor",function(a,b,c,d,e,f){function g(){angular.forEach(a.model,function(b,c){if("query"===c)a.searchQuery=b;else{var d=e("filter")(a.parameters,function(a){return a.key===c})[0];void 0!==d&&a.addSearchParam(d,b,!1)}})}function h(b,c,f,g){j&&d.cancel(j),k=e("filter")(k,function(a){return a.key!==c&&a.index!==f}),k.push({command:b,key:c,index:f,value:g}),j=d(function(){angular.forEach(k,function(b){var d=e("filter")(a.parameters,function(a){return a.key===c})[0];d&&d.allowMultiple?(angular.isArray(a.model[b.key])||(a.model[b.key]=[]),"delete"===b.command?(a.model[b.key].splice(b.index,1),0===a.model[b.key].length&&delete a.model[b.key]):a.model[b.key][b.index]=b.value):"delete"===b.command?delete a.model[b.key]:a.model[b.key]=b.value}),k.length=0,a.$emit("advanced-searchbox:modelUpdated",a.model)},a.searchThrottleTime)}function i(a){if(!a)return 0;try{if("number"==typeof a.selectionStart)return"backward"===a.selectionDirection?a.selectionStart:a.selectionEnd;if(document.selection){a.focus();var b=document.selection.createRange(),c=document.selection.createRange().text.length;return b.moveStart("character",-a.value.length),b.text.length-c}}catch(d){}return 0}a.parametersLabel=a.parametersLabel||"Parameter Suggestions",a.parametersDisplayLimit=a.parametersDisplayLimit||8,a.placeholder=a.placeholder||"Search ...",a.searchThrottleTime=a.searchThrottleTime||1e3,a.searchParams=[],a.searchQuery="",a.setFocusFor=f;var j,k=[];a.$watch("model",function(b,c){if(!angular.equals(b,c)){angular.forEach(a.model,function(b,c){if("query"===c&&a.searchQuery!==b)a.searchQuery=b;else{var d=e("filter")(a.parameters,function(a){return a.key===c})[0],f=e("filter")(a.searchParams,function(a){return a.key===c});if(void 0!==d)if(d.allowMultiple){if(angular.isArray(b)||(b=[b]),b.forEach(function(b,c){if(f.some(function(a){return a.index===c})){var e=f.filter(function(a){return a.index===c});e[0].value!==b&&(e[0].value=b)}else a.addSearchParam(d,b,!1)}),b.length=0;d--){var f=a.searchParams[d];if(!a.model.hasOwnProperty(f.key)){var g=a.searchParams.map(function(a){return a.key}).indexOf(f.key);a.removeSearchParam(g)}}}},!0),a.searchParamValueChanged=function(a){h("change",a.key,a.index,a.value)},a.searchQueryChanged=function(a){h("change","query",0,a)},a.enterEditMode=function(b,c){if(void 0!==b&&b.stopPropagation(),void 0!==c){var d=a.searchParams[c];d.editMode=!0,f("searchParam:"+d.key),a.$emit("advanced-searchbox:enteredEditMode",d)}},a.leaveEditMode=function(b,c){if(void 0!==c){var d=a.searchParams[c];d.editMode=!1,a.$emit("advanced-searchbox:leavedEditMode",d),d.value||a.removeSearchParam(c)}},a.searchQueryTypeaheadOnSelect=function(b){a.addSearchParam(b),a.searchQuery="",h("delete","query",0)},a.searchParamTypeaheadOnSelect=function(b,c){c.value=b,a.searchParamValueChanged(c)},a.isUnsedParameter=function(b){return 0===e("filter")(a.searchParams,function(a){return a.key===b.key&&!a.allowMultiple}).length},a.addSearchParam=function(b,c,f){if(void 0===f&&(f=!0),a.isUnsedParameter(b)){var g=0;b.allowMultiple&&(g=e("filter")(a.searchParams,function(a){return a.key===b.key}).length);var i=a.searchParams.push({key:b.key,name:b.name,type:b.type||"text",placeholder:b.placeholder,allowMultiple:b.allowMultiple||!1,suggestedValues:b.suggestedValues||[],restrictToSuggestedValues:b.restrictToSuggestedValues||!1,index:g,value:c||""})-1;h("add",b.key,g,c),f===!0&&d(function(){a.enterEditMode(void 0,i)},100),a.$emit("advanced-searchbox:addedSearchParam",b)}},a.removeSearchParam=function(b){if(void 0!==b){var c=a.searchParams[b];if(a.searchParams.splice(b,1),c.allowMultiple)for(var d=e("filter")(a.searchParams,function(a){return a.key===c.key}),f=0;f0?a.enterEditMode(void 0,b-1):a.searchParams.length>0?a.enterEditMode(void 0,a.searchParams.length-1):0===a.searchParams.length&&f("searchbox")},a.editNext=function(b){void 0!==b&&(a.leaveEditMode(void 0,b),b
'),g=angular.element(''),h="none"===c.css("maxWidth")?c.parent().innerWidth():c.css("maxWidth");c.css("maxWidth",h),angular.forEach(["fontSize","fontFamily","fontWeight","fontStyle","letterSpacing","textTransform","wordSpacing","textIndent","boxSizing","borderLeftWidth","borderRightWidth","borderLeftStyle","borderRightStyle","paddingLeft","paddingRight","marginLeft","marginRight"],function(a){g.css(a,c.css(a))}),angular.element("body").append(f.append(g)),d(),b.model?b.$watch("model",function(){d()}):c.on("keypress keyup keydown focus input propertychange change",function(){d()})}}}])}(); \ No newline at end of file + +!function(){"use strict";angular.module("angular-advanced-searchbox",[]).directive("nitAdvancedSearchbox",function(){return{restrict:"E",scope:{model:"=ngModel",parameters:"=",parametersLabel:"@",parametersDisplayLimit:"=?",placeholder:"@",trashIconClass:"@",searchIconClass:"@",plusIconClass:"@",searchThrottleTime:"=?"},replace:!0,templateUrl:function(e,a){return a.templateUrl||"angular-advanced-searchbox.html"},controller:["$scope","$attrs","$element","$timeout","$filter","setFocusFor",function(x,e,a,i,P,t){function k(e){return e}var n;x.trashIconClass=x.trashIconClass||"glyphicon glyphicon-trash",x.searchIconClass=x.searchIconClass||"glyphicon glyphicon-search",x.plusIconClass=x.plusIconClass||"glyphicon glyphicon-plus",x.parametersLabel=x.parametersLabel||"Parameter Suggestions",x.parametersDisplayLimit=x.parametersDisplayLimit||8,x.placeholder=x.placeholder||"Search ...",x.searchThrottleTime=x.searchThrottleTime||1e3,x.searchParams=[],x.searchQuery="",x.setFocusFor=t;var o=[];function l(e,g,a,r){n&&i.cancel(n),(o=P("filter")(o,function(e){return e.key!==g&&e.index!==a})).push({command:e,key:g,index:a,value:r}),n=i(function(){angular.forEach(o,function(e){var a,r,t=P("filter")(x.searchParams,function(e){return e.key===g})[0],n=P("filter")(x.parameters,function(e){return e.key===g})[0],i="key",o=n&&!0===n.asObject,l=angular.isObject(e.value),c=angular.isDefined(e.value),s="query"===e.key&&angular.isUndefined(n),u=!s&&n.keyTransformer&&angular.isFunction(n.keyTransformer)?n.keyTransformer:k,d=!s&&n.valueTransformer&&angular.isFunction(n.valueTransformer)?n.valueTransformer:k,h=!s&&n.viewKeyTransformer&&angular.isFunction(n.viewKeyTransformer)?n.viewKeyTransformer:k,m=!s&&n.viewValueTransformer&&angular.isFunction(n.viewValueTransformer)?n.viewValueTransformer:k,f=e.value;if(!s){c&&(l?(i=n.viewKey,r=f[n.viewValue],a=f[i],f=o?f:f[i]):f=o?{value:f}:f);var v=f,y=a,p=r;g=u(g),f=d(v),a=h(y),r=m(p),e.value=f,e.key=g}n&&n.allowMultiple?(angular.isArray(x.model[e.key])||(x.model[e.key]=[]),"delete"===e.command?(x.model[e.key].splice(e.index,1),0===x.model[e.key].length&&delete x.model[e.key]):x.model[e.key][e.index]=e.value):"delete"===e.command?delete x.model[e.key]:x.model[e.key]=e.value,t&&(t.$$view={key:g,value:f,viewKey:i,viewValue:r})}),o.length=0,x.$emit("advanced-searchbox:modelUpdated",x.model)},x.searchThrottleTime)}x.$watch("model",function(e,a){if(!angular.equals(e,a)){angular.forEach(x.model,function(e,a){if("query"===a&&x.searchQuery!==e)x.searchQuery=e;else{var t=P("filter")(x.parameters,function(e){return e.key===a})[0],n=P("filter")(x.searchParams,function(e){return e.key===a});if(void 0!==t)if(t.allowMultiple){if(angular.isArray(e)||(e=[e]),e.forEach(function(e,a){if(n.some(function(e){return e.index===a})){var r=n.filter(function(e){return e.index===a});r[0].value!==e&&(r[0].value=e)}else x.addSearchParam(t,e,!1)}),e.length
'),i=angular.element(''),o="none"===a.css("maxWidth")?a.parent().innerWidth():a.css("maxWidth");function l(){c(function(){-1!==t.indexOf(a[0].type||"text")&&(i.text(a.val()||a.attr("placeholder")),a.css("width",i.outerWidth()+10))})}a.css("maxWidth",o),angular.forEach(["fontSize","fontFamily","fontWeight","fontStyle","letterSpacing","textTransform","wordSpacing","textIndent","boxSizing","borderLeftWidth","borderRightWidth","borderLeftStyle","borderRightStyle","paddingLeft","paddingRight","marginLeft","marginRight"],function(e){i.css(e,a.css(e))}),angular.element("body").append(n.append(i)),l(),e.model?e.$watch("model",function(){l()}):a.on("keypress keyup keydown focus input propertychange change",function(){l()})}}}])}(); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..77d4204 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1720 @@ +{ + "name": "angular-advanced-searchbox", + "version": "3.0.2", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + } + } + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "bower": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.2.tgz", + "integrity": "sha1-rfU1KcjUrwLvJPuNU0HBQZ0z4vc=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "dev": true, + "requires": { + "pako": "0.2.9" + } + }, + "buffer-from": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", + "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "2.3.2", + "upper-case": "1.1.3" + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + } + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "change-case": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz", + "integrity": "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==", + "dev": true, + "requires": { + "camel-case": "3.0.0", + "constant-case": "2.0.0", + "dot-case": "2.1.1", + "header-case": "1.0.1", + "is-lower-case": "1.1.3", + "is-upper-case": "1.1.2", + "lower-case": "1.1.4", + "lower-case-first": "1.0.2", + "no-case": "2.3.2", + "param-case": "2.1.1", + "pascal-case": "2.0.1", + "path-case": "2.1.1", + "sentence-case": "2.1.1", + "snake-case": "2.1.0", + "swap-case": "1.1.2", + "title-case": "2.1.1", + "upper-case": "1.1.3", + "upper-case-first": "1.1.2" + } + }, + "clean-css": { + "version": "3.4.28", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", + "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", + "dev": true, + "requires": { + "commander": "2.8.1", + "source-map": "0.4.4" + }, + "dependencies": { + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } + } + } + }, + "cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "dev": true, + "requires": { + "exit": "0.1.2", + "glob": "7.1.2" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + } + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "coffeescript": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.10.0.tgz", + "integrity": "sha1-56qDAZF+9iGzXYo580jc3R234z4=", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "1.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.5", + "typedarray": "0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", + "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.1.4" + } + }, + "constant-case": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", + "integrity": "sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY=", + "dev": true, + "requires": { + "snake-case": "2.1.0", + "upper-case": "1.1.3" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "4.0.1", + "meow": "3.7.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "1.1.3", + "entities": "1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" + } + }, + "dot-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", + "integrity": "sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4=", + "dev": true, + "requires": { + "no-case": "2.3.2" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", + "dev": true + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "file-sync-cmp": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", + "integrity": "sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs=", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "findup-sync": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "dev": true, + "requires": { + "glob": "5.0.15" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "getobject": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", + "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", + "dev": true + }, + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "grunt": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.2.tgz", + "integrity": "sha1-TmpeaVtwRy/VME9fqeNCNoNqc7w=", + "dev": true, + "requires": { + "coffeescript": "1.10.0", + "dateformat": "1.0.12", + "eventemitter2": "0.4.14", + "exit": "0.1.2", + "findup-sync": "0.3.0", + "glob": "7.0.6", + "grunt-cli": "1.2.0", + "grunt-known-options": "1.1.0", + "grunt-legacy-log": "1.0.1", + "grunt-legacy-util": "1.0.0", + "iconv-lite": "0.4.19", + "js-yaml": "3.5.5", + "minimatch": "3.0.4", + "nopt": "3.0.6", + "path-is-absolute": "1.0.1", + "rimraf": "2.2.8" + }, + "dependencies": { + "grunt-cli": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", + "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", + "dev": true, + "requires": { + "findup-sync": "0.3.0", + "grunt-known-options": "1.1.0", + "nopt": "3.0.6", + "resolve": "1.1.7" + } + } + } + }, + "grunt-angular-templates": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-angular-templates/-/grunt-angular-templates-1.1.0.tgz", + "integrity": "sha1-EJYDorlf8BAZtxjHA0EmjwnYvhk=", + "dev": true, + "requires": { + "html-minifier": "2.1.7" + } + }, + "grunt-bump": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/grunt-bump/-/grunt-bump-0.8.0.tgz", + "integrity": "sha1-0//gzzzws44JYHt4U49CpTHq/lU=", + "dev": true, + "requires": { + "semver": "5.5.0" + } + }, + "grunt-contrib-clean": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-1.1.0.tgz", + "integrity": "sha1-Vkq/LQN4qYOhW54/MO51tzjEBjg=", + "dev": true, + "requires": { + "async": "1.5.2", + "rimraf": "2.6.2" + }, + "dependencies": { + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.0.6" + } + } + } + }, + "grunt-contrib-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-1.0.1.tgz", + "integrity": "sha1-YVCYYwhOhx1+ht5IwBUlntl3Rb0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "grunt-contrib-copy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz", + "integrity": "sha1-cGDGWB6QS4qw0A8HbgqPbj58NXM=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "file-sync-cmp": "0.1.1" + } + }, + "grunt-contrib-cssmin": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-2.2.1.tgz", + "integrity": "sha512-IXNomhQ5ekVZbDbj/ik5YccoD9khU6LT2fDXqO1+/Txjq8cp0tQKjVS8i8EAbHOrSDkL7/UD6A7b+xj98gqh9w==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "clean-css": "4.1.11", + "maxmin": "2.1.0" + }, + "dependencies": { + "clean-css": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", + "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "grunt-contrib-jshint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-1.1.0.tgz", + "integrity": "sha1-Np2QmyWTxA6L55lAshNAhQx5Oaw=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "hooker": "0.2.3", + "jshint": "2.9.5" + } + }, + "grunt-contrib-uglify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-3.3.0.tgz", + "integrity": "sha512-W9O7lJE3PlD8VCc5fyaf98QV7f5wEDiU4PBIh0+/6UBbk2LhgzEFS0/p+taH5UD3+PlEn7QPN0o06Z0To6SqXw==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "maxmin": "1.1.0", + "uglify-js": "3.3.16", + "uri-path": "1.0.0" + }, + "dependencies": { + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "gzip-size": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-1.0.0.tgz", + "integrity": "sha1-Zs+LEBBHInuVus5uodoMF37Vwi8=", + "dev": true, + "requires": { + "browserify-zlib": "0.1.4", + "concat-stream": "1.6.2" + } + }, + "maxmin": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-1.1.0.tgz", + "integrity": "sha1-cTZehKmd2Piz99X94vANHn9zvmE=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "figures": "1.7.0", + "gzip-size": "1.0.0", + "pretty-bytes": "1.0.4" + } + }, + "pretty-bytes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", + "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", + "dev": true, + "requires": { + "get-stdin": "4.0.1", + "meow": "3.7.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "uglify-js": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.16.tgz", + "integrity": "sha512-FMh5SRqJRGhv9BbaTffENIpDDQIoPDR8DBraunGORGhySArsXlw9++CN+BWzPBLpoI4RcSnpfGPnilTxWL3Vvg==", + "dev": true, + "requires": { + "commander": "2.15.1", + "source-map": "0.6.1" + } + } + } + }, + "grunt-known-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz", + "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=", + "dev": true + }, + "grunt-legacy-log": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-1.0.1.tgz", + "integrity": "sha512-rwuyqNKlI0IPz0DvxzJjcEiQEBaBNVeb1LFoZKxSmHLETFUwhwUrqOsPIxURTKSwNZHZ4ht1YLBYmVU0YZAzHQ==", + "dev": true, + "requires": { + "colors": "1.1.2", + "grunt-legacy-log-utils": "1.0.0", + "hooker": "0.2.3", + "lodash": "4.17.5", + "underscore.string": "3.3.4" + } + }, + "grunt-legacy-log-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-1.0.0.tgz", + "integrity": "sha1-p7ji0Ps1taUPSvmG/BEnSevJbz0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "lodash": "4.3.0" + }, + "dependencies": { + "lodash": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", + "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", + "dev": true + } + } + }, + "grunt-legacy-util": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.0.0.tgz", + "integrity": "sha1-OGqnjcbtUJhsKxiVcmWxtIq7m4Y=", + "dev": true, + "requires": { + "async": "1.5.2", + "exit": "0.1.2", + "getobject": "0.1.0", + "hooker": "0.2.3", + "lodash": "4.3.0", + "underscore.string": "3.2.3", + "which": "1.2.14" + }, + "dependencies": { + "lodash": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", + "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", + "dev": true + }, + "underscore.string": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.2.3.tgz", + "integrity": "sha1-gGmSYzZl1eX8tNsfs6hi62jp5to=", + "dev": true + } + } + }, + "gzip-size": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", + "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", + "dev": true, + "requires": { + "duplexer": "0.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "header-case": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", + "integrity": "sha1-lTWXMZfBRLCWE81l0xfvGZY70C0=", + "dev": true, + "requires": { + "no-case": "2.3.2", + "upper-case": "1.1.3" + } + }, + "hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", + "dev": true + }, + "hosted-git-info": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", + "dev": true + }, + "html-minifier": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-2.1.7.tgz", + "integrity": "sha1-kFHW/LvPIU7TB+GtdPQyu5rWVcw=", + "dev": true, + "requires": { + "change-case": "3.0.2", + "clean-css": "3.4.28", + "commander": "2.9.0", + "he": "1.1.1", + "ncname": "1.0.0", + "relateurl": "0.2.7", + "uglify-js": "2.6.4" + } + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.3.0", + "domutils": "1.5.1", + "entities": "1.0.0", + "readable-stream": "1.1.14" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-lower-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", + "integrity": "sha1-fhR75HaNxGbbO/shzGCzHmrWk5M=", + "dev": true, + "requires": { + "lower-case": "1.1.4" + } + }, + "is-upper-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", + "integrity": "sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8=", + "dev": true, + "requires": { + "upper-case": "1.1.3" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "js-yaml": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz", + "integrity": "sha1-A3fDgBfKvHMisNH7zSWkkWQfL74=", + "dev": true, + "requires": { + "argparse": "1.0.10", + "esprima": "2.7.3" + } + }, + "jshint": { + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.5.tgz", + "integrity": "sha1-HnJSkVzmgbQIJ+4UJIxG006apiw=", + "dev": true, + "requires": { + "cli": "1.0.1", + "console-browserify": "1.1.0", + "exit": "0.1.2", + "htmlparser2": "3.8.3", + "lodash": "3.7.0", + "minimatch": "3.0.4", + "shelljs": "0.3.0", + "strip-json-comments": "1.0.4" + }, + "dependencies": { + "lodash": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz", + "integrity": "sha1-Nni9irmVBXwHreg27S7wh9qBHUU=", + "dev": true + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lower-case-first": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", + "integrity": "sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E=", + "dev": true, + "requires": { + "lower-case": "1.1.4" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "maxmin": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-2.1.0.tgz", + "integrity": "sha1-TTsiCQPZXu5+t6x/qGTnLcCaMWY=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "figures": "1.7.0", + "gzip-size": "3.0.0", + "pretty-bytes": "3.0.1" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "ncname": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", + "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", + "dev": true, + "requires": { + "xml-char-classes": "1.0.0" + } + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "1.1.4" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1.1.1" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "dev": true + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "2.3.2" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "pascal-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", + "integrity": "sha1-LVeNNFX2YNpl7KGO+VtODekSdh4=", + "dev": true, + "requires": { + "camel-case": "3.0.0", + "upper-case-first": "1.1.2" + } + }, + "path-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", + "integrity": "sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU=", + "dev": true, + "requires": { + "no-case": "2.3.2" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pretty-bytes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz", + "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "sentence-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", + "integrity": "sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ=", + "dev": true, + "requires": { + "no-case": "2.3.2", + "upper-case-first": "1.1.2" + } + }, + "shelljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", + "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "snake-case": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", + "integrity": "sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8=", + "dev": true, + "requires": { + "no-case": "2.3.2" + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "dev": true, + "requires": { + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true + }, + "sprintf-js": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz", + "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "swap-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", + "integrity": "sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=", + "dev": true, + "requires": { + "lower-case": "1.1.4", + "upper-case": "1.1.3" + } + }, + "title-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", + "integrity": "sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=", + "dev": true, + "requires": { + "no-case": "2.3.2", + "upper-case": "1.1.3" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.4.tgz", + "integrity": "sha1-ZeovswWck5RpLxX+2HwrNsFrmt8=", + "dev": true, + "requires": { + "async": "0.2.10", + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true + }, + "underscore.string": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.4.tgz", + "integrity": "sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s=", + "dev": true, + "requires": { + "sprintf-js": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "upper-case-first": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", + "integrity": "sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=", + "dev": true, + "requires": { + "upper-case": "1.1.3" + } + }, + "uri-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", + "integrity": "sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "dev": true, + "requires": { + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" + } + }, + "which": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xml-char-classes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", + "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + } + } + } + } +} diff --git a/package.json b/package.json index 6871408..b25ac7f 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,11 @@ { "name": "angular-advanced-searchbox", - "version": "3.0.0", + "version": "3.0.4", "description": "A directive for AngularJS providing a advanced visual search box", "main": "dist/angular-advanced-searchbox-tpls.js", "repository": { "type": "git", - "url": "https://github.com/dnauck/angular-advanced-searchbox" + "url": "https://github.com/marchrius/angular-advanced-searchbox" }, "keywords": [ "search", @@ -16,29 +16,36 @@ "name": "Nauck IT KG", "url": "http://www.nauck-it.de/" }, + "maintainers": [ + { + "name": "Matteo Gaggiano", + "email": "m.gaggiano@marchirus.org", + "url": "http://www.marchrius.org/" + } + ], "contributors": [ { - "name": "Daniel Nauck", - "email": "d.nauck@nauck-it.de", - "url": "http://www.nauck-it.de/" + "name": "Matteo Gaggiano", + "email": "m.gaggiano@marchirus.org", + "url": "http://www.marchrius.org/" } ], "license": "MIT", "bugs": { - "url": "https://github.com/dnauck/angular-advanced-searchbox/issues" + "url": "https://github.com/marchrius/angular-advanced-searchbox/issues" }, - "homepage": "https://github.com/dnauck/angular-advanced-searchbox", + "homepage": "https://github.com/marchrius/angular-advanced-searchbox", "devDependencies": { - "bower": "^1.3.12", - "grunt": "^0.4.5", - "grunt-angular-templates": "^0.5.7", - "grunt-bump": "^0.1.0", - "grunt-contrib-clean": "^0.6.0", - "grunt-contrib-concat": "^0.5.0", - "grunt-contrib-copy": "^0.7.0", - "grunt-contrib-cssmin": "^0.10.0", - "grunt-contrib-jshint": "^0.10.0", - "grunt-contrib-uglify": "^0.6.0" + "bower": "^1.8.2", + "grunt": "^1.0.2", + "grunt-angular-templates": "^1.1.0", + "grunt-bump": "^0.8.0", + "grunt-contrib-clean": "^1.1.0", + "grunt-contrib-concat": "^1.0.1", + "grunt-contrib-copy": "^1.0.0", + "grunt-contrib-cssmin": "^2.2.1", + "grunt-contrib-jshint": "^1.1.0", + "grunt-contrib-uglify": "^3.3.0" }, "scripts": { "postinstall": "bower install" diff --git a/src/angular-advanced-searchbox.html b/src/angular-advanced-searchbox.html index 8210ce2..bf9581b 100644 --- a/src/angular-advanced-searchbox.html +++ b/src/angular-advanced-searchbox.html @@ -1,26 +1,27 @@
- + - +
- + -
{{searchParam.name}}:
+
{{searchParam.name}}:
- {{searchParam.value}} + {{searchParam.$$view.viewValue || searchParam.$$view.value}} - {{param.name}} + {{param.name}}
\ No newline at end of file diff --git a/src/angular-advanced-searchbox.js b/src/angular-advanced-searchbox.js index 227c295..0544bd8 100644 --- a/src/angular-advanced-searchbox.js +++ b/src/angular-advanced-searchbox.js @@ -20,6 +20,9 @@ angular.module('angular-advanced-searchbox', []) parametersLabel: '@', parametersDisplayLimit: '=?', placeholder: '@', + trashIconClass: '@', + searchIconClass: '@', + plusIconClass: '@', searchThrottleTime: '=?' }, replace: true, @@ -30,6 +33,14 @@ angular.module('angular-advanced-searchbox', []) '$scope', '$attrs', '$element', '$timeout', '$filter', 'setFocusFor', function ($scope, $attrs, $element, $timeout, $filter, setFocusFor) { + $scope.trashIconClass = $scope.trashIconClass || 'glyphicon glyphicon-trash'; + $scope.searchIconClass = $scope.searchIconClass || 'glyphicon glyphicon-search'; + $scope.plusIconClass = $scope.plusIconClass || 'glyphicon glyphicon-plus'; + + function returnAsIs(arg0) { + return arg0; + } + $scope.parametersLabel = $scope.parametersLabel || 'Parameter Suggestions'; $scope.parametersDisplayLimit = $scope.parametersDisplayLimit || 8; $scope.placeholder = $scope.placeholder || 'Search ...'; @@ -165,6 +176,8 @@ angular.module('angular-advanced-searchbox', []) $scope.searchParams.push( { key: searchParam.key, + viewKey: searchParam.viewKey, + viewValue: searchParam.viewValue, name: searchParam.name, type: searchParam.type || 'text', placeholder: searchParam.placeholder, @@ -311,8 +324,52 @@ angular.module('angular-advanced-searchbox', []) searchThrottleTimer = $timeout(function () { angular.forEach(changeBuffer, function (change) { - var searchParam = $filter('filter')($scope.parameters, function (param) { return param.key === key; })[0]; - if(searchParam && searchParam.allowMultiple){ + var searchParam = $filter('filter')($scope.searchParams, function (param) { return param.key === key; })[0]; + var parameter = $filter('filter')($scope.parameters, function (param) { return param.key === key; })[0]; + var viewKeyKey = 'key', viewKey, viewValueKey = 'value', viewValue; + // as Object is related to model and not to configuration + var asObject = parameter && parameter.asObject === true; + var isObject = angular.isObject(change.value); + var isDefined = angular.isDefined(change.value); + var isQueryMode = change.key === 'query' && angular.isUndefined(parameter); + var keyTransFn = !isQueryMode && parameter.keyTransformer && angular.isFunction(parameter.keyTransformer) ? parameter.keyTransformer : returnAsIs; + var valueTransFn = !isQueryMode && parameter.valueTransformer && angular.isFunction(parameter.valueTransformer) ? parameter.valueTransformer : returnAsIs; + var viewKeyTransFn = !isQueryMode && parameter.viewKeyTransformer && angular.isFunction(parameter.viewKeyTransformer) ? parameter.viewKeyTransformer : returnAsIs; + var viewValueTransFn = !isQueryMode && parameter.viewValueTransformer && angular.isFunction(parameter.viewValueTransformer) ? parameter.viewValueTransformer : returnAsIs; + + var value = change.value; + + // activate only if not query mode + if (!isQueryMode) { + if (isDefined) { + if (isObject) { + viewKeyKey = parameter.viewKey; + viewValueKey = parameter.viewValue; + viewValue = value[viewValueKey]; + viewKey = value[viewKeyKey]; + value = asObject ? value : value[viewKeyKey]; + } else { + value = asObject ? { value: value } : value; + } + } + + var transformValue = value; + var transformKey = key; + var transformViewKey = viewKey; + var transformViewValue = viewValue; + + key = keyTransFn(transformKey); + value = valueTransFn(transformValue); + viewKey = viewKeyTransFn(transformViewKey); + viewValue = viewValueTransFn(transformViewValue); + + // restore change model with new properties + change.value = value; + change.key = key; + } + + + if(parameter && parameter.allowMultiple) { if(!angular.isArray($scope.model[change.key])) $scope.model[change.key] = []; @@ -329,6 +386,15 @@ angular.module('angular-advanced-searchbox', []) else $scope.model[change.key] = change.value; } + + if (searchParam) { + searchParam.$$view = { + key: key, + value: value, + viewKey: viewKeyKey, + viewValue: viewValue + }; + } }); changeBuffer.length = 0; @@ -364,6 +430,14 @@ angular.module('angular-advanced-searchbox', []) ] }; }) + .filter('flattenObject', [ + function() { + return function(value, key) { + // suggestedValue[searchParam.viewKey] as suggestedValue[searchParam.viewValue] for suggestedValue in searchParam.suggestedValues | filter:$viewValue + return angular.isObject(value) ? value[key] : value; + }; + } + ]) .directive('setFocusOn', [ function() { return {