Skip to content

Instantly share code, notes, and snippets.

@clouddueling
Created April 3, 2013 03:03
Show Gist options
  • Save clouddueling/5298119 to your computer and use it in GitHub Desktop.
Save clouddueling/5298119 to your computer and use it in GitHub Desktop.
X Editable for Bootstrap + Angular UI
/*
MIT License, http://www.opensource.org/licenses/MIT
*/
angular.module("ui.config",[]).value("ui.config",{});angular.module("ui.filters",["ui.config"]);angular.module("ui.directives",["ui.config"]);angular.module("ui",["ui.filters","ui.directives","ui.config"]);
angular.module("ui.directives").directive("uiAnimate",["ui.config","$timeout",function(uiConfig,$timeout){var options={};if(angular.isString(uiConfig.animate))options["class"]=uiConfig.animate;else if(uiConfig.animate)options=uiConfig.animate;return{restrict:"A",link:function($scope,element,attrs){var opts={};if(attrs.uiAnimate){opts=$scope.$eval(attrs.uiAnimate);if(angular.isString(opts))opts={"class":opts}}opts=angular.extend({"class":"ui-animate"},options,opts);element.addClass(opts["class"]);
$timeout(function(){element.removeClass(opts["class"])},20,false)}}}]);
angular.module("ui.directives").directive("uiCalendar",["ui.config","$parse",function(uiConfig,$parse){uiConfig.uiCalendar=uiConfig.uiCalendar||{};return{require:"ngModel",restrict:"A",link:function(scope,elm,attrs,$timeout){var sources=scope.$eval(attrs.ngModel);var tracker=0;var getSources=function(){var equalsTracker=scope.$eval(attrs.equalsTracker);tracker=0;angular.forEach(sources,function(value,key){if(angular.isArray(value))tracker+=value.length});if(angular.isNumber(equalsTracker))return tracker+
sources.length+equalsTracker;else return tracker+sources.length};function update(){scope.calendar=elm.html("");var view=scope.calendar.fullCalendar("getView");if(view)view=view.name;var expression,options={defaultView:view,eventSources:sources};if(attrs.uiCalendar)expression=scope.$eval(attrs.uiCalendar);else expression={};angular.extend(options,uiConfig.uiCalendar,expression);scope.calendar.fullCalendar(options)}update();scope.$watch(getSources,function(newVal,oldVal){update()})}}}]);
angular.module("ui.directives").directive("uiCodemirror",["ui.config","$timeout",function(uiConfig,$timeout){var events=["cursorActivity","viewportChange","gutterClick","focus","blur","scroll","update"];return{restrict:"A",require:"ngModel",link:function(scope,elm,attrs,ngModel){var options,opts,onChange,deferCodeMirror,codeMirror;if(elm[0].type!=="textarea")throw new Error("uiCodemirror3 can only be applied to a textarea element");options=uiConfig.codemirror||{};opts=angular.extend({},options,scope.$eval(attrs.uiCodemirror));
onChange=function(aEvent){return function(instance,changeObj){var newValue=instance.getValue();if(newValue!==ngModel.$viewValue){ngModel.$setViewValue(newValue);scope.$apply()}if(typeof aEvent==="function")aEvent(instance,changeObj)}};deferCodeMirror=function(){codeMirror=CodeMirror.fromTextArea(elm[0],opts);codeMirror.on("change",onChange(opts.onChange));for(var i=0,n=events.length,aEvent;i<n;++i){aEvent=opts["on"+events[i].charAt(0).toUpperCase()+events[i].slice(1)];if(aEvent===void 0)continue;
if(typeof aEvent!=="function")continue;codeMirror.on(events[i],aEvent)}ngModel.$formatters.push(function(value){if(angular.isUndefined(value)||value===null)return"";else if(angular.isObject(value)||angular.isArray(value))throw new Error("ui-codemirror cannot use an object or an array as a model");return value});ngModel.$render=function(){codeMirror.setValue(ngModel.$viewValue)};if(attrs.uiRefresh)scope.$watch(attrs.uiRefresh,function(newVal,oldVal){if(newVal!==oldVal)$timeout(codeMirror.refresh)})};
$timeout(deferCodeMirror)}}}]);
angular.module("ui.directives").directive("uiCurrency",["ui.config","currencyFilter",function(uiConfig,currencyFilter){var options={pos:"ui-currency-pos",neg:"ui-currency-neg",zero:"ui-currency-zero"};if(uiConfig.currency)angular.extend(options,uiConfig.currency);return{restrict:"EAC",require:"ngModel",link:function(scope,element,attrs,controller){var opts,renderview,value;opts=angular.extend({},options,scope.$eval(attrs.uiCurrency));renderview=function(viewvalue){var num;num=viewvalue*1;element.toggleClass(opts.pos,
num>0);element.toggleClass(opts.neg,num<0);element.toggleClass(opts.zero,num===0);if(viewvalue==="")element.text("");else element.text(currencyFilter(num,opts.symbol));return true};controller.$render=function(){value=controller.$viewValue;element.val(value);renderview(value)}}}}]);
angular.module("ui.directives").directive("uiDate",["ui.config",function(uiConfig){var options;options={};if(angular.isObject(uiConfig.date))angular.extend(options,uiConfig.date);return{require:"?ngModel",link:function(scope,element,attrs,controller){var getOptions=function(){return angular.extend({},uiConfig.date,scope.$eval(attrs.uiDate))};var initDateWidget=function(){var opts=getOptions();if(controller){var updateModel=function(){scope.$apply(function(){var date=element.datepicker("getDate");
var value=new Date(element.val());element.datepicker("setDate",value);controller.$setViewValue(value);element.blur()})};if(opts.onSelect){var userHandler=opts.onSelect;opts.onSelect=function(value,picker){updateModel();scope.$apply(function(){userHandler(value,picker)})}}else opts.onSelect=updateModel;element.bind("change",updateModel);controller.$render=function(){var date=controller.$viewValue;if(angular.isDefined(date)&&date!==null&&!angular.isDate(date))throw new Error("ng-Model value must be a Date object - currently it is a "+
typeof date+" - use ui-date-format to convert it from a string");element.datepicker("setDate",date)}}element.datepicker("destroy");element.datepicker(opts);if(controller)controller.$render()};scope.$watch(getOptions,initDateWidget,true)}}}]).directive("uiDateFormat",["ui.config",function(uiConfig){var directive={require:"ngModel",link:function(scope,element,attrs,modelCtrl){var dateFormat=attrs.uiDateFormat||uiConfig.dateFormat;if(dateFormat){modelCtrl.$formatters.push(function(value){if(angular.isString(value))return $.datepicker.parseDate(dateFormat,
value)});modelCtrl.$parsers.push(function(value){if(value)return $.datepicker.formatDate(dateFormat,value)})}else{modelCtrl.$formatters.push(function(value){if(angular.isString(value))return new Date(value)});modelCtrl.$parsers.push(function(value){if(value)return value.toISOString()})}}};return directive}]);
angular.module("ui.directives").directive("uiEvent",["$parse",function($parse){return function(scope,elm,attrs){var events=scope.$eval(attrs.uiEvent);angular.forEach(events,function(uiEvent,eventName){var fn=$parse(uiEvent);elm.bind(eventName,function(evt){var params=Array.prototype.slice.call(arguments);params=params.splice(1);scope.$apply(function(){fn(scope,{$event:evt,$params:params})})})})}}]);
angular.module("ui.directives").directive("uiIf",[function(){return{transclude:"element",priority:1E3,terminal:true,restrict:"A",compile:function(element,attr,transclude){return function(scope,element,attr){var childElement;var childScope;scope.$watch(attr["uiIf"],function(newValue){if(childElement){childElement.remove();childElement=undefined}if(childScope){childScope.$destroy();childScope=undefined}if(newValue){childScope=scope.$new();transclude(childScope,function(clone){childElement=clone;element.after(clone)})}})}}}}]);
angular.module("ui.directives").directive("uiJq",["ui.config","$timeout",function uiJqInjectingFunction(uiConfig,$timeout){return{restrict:"A",compile:function uiJqCompilingFunction(tElm,tAttrs){if(!angular.isFunction(tElm[tAttrs.uiJq]))throw new Error('ui-jq: The "'+tAttrs.uiJq+'" function does not exist');var options=uiConfig.jq&&uiConfig.jq[tAttrs.uiJq];return function uiJqLinkingFunction(scope,elm,attrs){var linkOptions=[];if(attrs.uiOptions){linkOptions=scope.$eval("["+attrs.uiOptions+"]");if(angular.isObject(options)&&
angular.isObject(linkOptions[0]))linkOptions[0]=angular.extend({},options,linkOptions[0])}else if(options)linkOptions=[options];if(attrs.ngModel&&elm.is("select,input,textarea"))elm.on("change",function(){elm.trigger("input")});function callPlugin(){$timeout(function(){elm[attrs.uiJq].apply(elm,linkOptions)},0,false)}if(attrs.uiRefresh)scope.$watch(attrs.uiRefresh,function(newVal){callPlugin()});callPlugin()}}}}]);
angular.module("ui.directives").factory("keypressHelper",["$parse",function keypress($parse){var keysByCode={8:"backspace",9:"tab",13:"enter",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"insert",46:"delete"};var capitaliseFirstLetter=function(string){return string.charAt(0).toUpperCase()+string.slice(1)};return function(mode,scope,elm,attrs){var params,combinations=[];params=scope.$eval(attrs["ui"+capitaliseFirstLetter(mode)]);angular.forEach(params,
function(v,k){var combination,expression;expression=$parse(v);angular.forEach(k.split(" "),function(variation){combination={expression:expression,keys:{}};angular.forEach(variation.split("-"),function(value){combination.keys[value]=true});combinations.push(combination)})});elm.bind(mode,function(event){var altPressed=event.metaKey||event.altKey;var ctrlPressed=event.ctrlKey;var shiftPressed=event.shiftKey;var keyCode=event.keyCode;if(mode==="keypress"&&!shiftPressed&&keyCode>=97&&keyCode<=122)keyCode=
keyCode-32;angular.forEach(combinations,function(combination){var mainKeyPressed=combination.keys[keysByCode[event.keyCode]]||combination.keys[event.keyCode.toString()]||false;var altRequired=combination.keys.alt||false;var ctrlRequired=combination.keys.ctrl||false;var shiftRequired=combination.keys.shift||false;if(mainKeyPressed&&altRequired==altPressed&&ctrlRequired==ctrlPressed&&shiftRequired==shiftPressed)scope.$apply(function(){combination.expression(scope,{"$event":event})})})})}}]);
angular.module("ui.directives").directive("uiKeydown",["keypressHelper",function(keypressHelper){return{link:function(scope,elm,attrs){keypressHelper("keydown",scope,elm,attrs)}}}]);angular.module("ui.directives").directive("uiKeypress",["keypressHelper",function(keypressHelper){return{link:function(scope,elm,attrs){keypressHelper("keypress",scope,elm,attrs)}}}]);
angular.module("ui.directives").directive("uiKeyup",["keypressHelper",function(keypressHelper){return{link:function(scope,elm,attrs){keypressHelper("keyup",scope,elm,attrs)}}}]);
(function(){var app=angular.module("ui.directives");function bindMapEvents(scope,eventsStr,googleObject,element){angular.forEach(eventsStr.split(" "),function(eventName){var $event={type:"map-"+eventName};google.maps.event.addListener(googleObject,eventName,function(evt){element.triggerHandler(angular.extend({},$event,evt));if(!scope.$$phase)scope.$apply()})})}app.directive("uiMap",["ui.config","$parse",function(uiConfig,$parse){var mapEvents="bounds_changed center_changed click dblclick drag dragend "+
"dragstart heading_changed idle maptypeid_changed mousemove mouseout "+"mouseover projection_changed resize rightclick tilesloaded tilt_changed "+"zoom_changed";var options=uiConfig.map||{};return{restrict:"A",link:function(scope,elm,attrs){var opts=angular.extend({},options,scope.$eval(attrs.uiOptions));var map=new google.maps.Map(elm[0],opts);var model=$parse(attrs.uiMap);model.assign(scope,map);bindMapEvents(scope,mapEvents,map,elm)}}}]);app.directive("uiMapInfoWindow",["ui.config","$parse","$compile",
function(uiConfig,$parse,$compile){var infoWindowEvents="closeclick content_change domready "+"position_changed zindex_changed";var options=uiConfig.mapInfoWindow||{};return{link:function(scope,elm,attrs){var opts=angular.extend({},options,scope.$eval(attrs.uiOptions));opts.content=elm[0];var model=$parse(attrs.uiMapInfoWindow);var infoWindow=model(scope);if(!infoWindow){infoWindow=new google.maps.InfoWindow(opts);model.assign(scope,infoWindow)}bindMapEvents(scope,infoWindowEvents,infoWindow,elm);
elm.replaceWith("<div></div>");var _open=infoWindow.open;infoWindow.open=function open(a1,a2,a3,a4,a5,a6){$compile(elm.contents())(scope);_open.call(infoWindow,a1,a2,a3,a4,a5,a6)}}}}]);function mapOverlayDirective(directiveName,events){app.directive(directiveName,[function(){return{restrict:"A",link:function(scope,elm,attrs){scope.$watch(attrs[directiveName],function(newObject){bindMapEvents(scope,events,newObject,elm)})}}}])}mapOverlayDirective("uiMapMarker","animation_changed click clickable_changed cursor_changed "+
"dblclick drag dragend draggable_changed dragstart flat_changed icon_changed "+"mousedown mouseout mouseover mouseup position_changed rightclick "+"shadow_changed shape_changed title_changed visible_changed zindex_changed");mapOverlayDirective("uiMapPolyline","click dblclick mousedown mousemove mouseout mouseover mouseup rightclick");mapOverlayDirective("uiMapPolygon","click dblclick mousedown mousemove mouseout mouseover mouseup rightclick");mapOverlayDirective("uiMapRectangle","bounds_changed click dblclick mousedown mousemove mouseout mouseover "+
"mouseup rightclick");mapOverlayDirective("uiMapCircle","center_changed click dblclick mousedown mousemove "+"mouseout mouseover mouseup radius_changed rightclick");mapOverlayDirective("uiMapGroundOverlay","click dblclick")})();
angular.module("ui.directives").directive("uiMask",[function(){return{require:"ngModel",link:function($scope,element,attrs,controller){controller.$render=function(){var value=controller.$viewValue||"";element.val(value);element.mask($scope.$eval(attrs.uiMask))};controller.$parsers.push(function(value){var isValid=element.isMaskValid()||angular.isUndefined(element.isMaskValid())&&element.val().length>0;controller.$setValidity("mask",isValid);return isValid?value:undefined});element.bind("keyup",function(){$scope.$apply(function(){controller.$setViewValue(element.mask())})})}}}]);
angular.module("ui.directives").directive("uiReset",["ui.config",function(uiConfig){var resetValue=null;if(uiConfig.reset!==undefined)resetValue=uiConfig.reset;return{require:"ngModel",link:function(scope,elm,attrs,ctrl){var aElement;aElement=angular.element('<a class="ui-reset" />');elm.wrap('<span class="ui-resetwrap" />').after(aElement);aElement.bind("click",function(e){e.preventDefault();scope.$apply(function(){if(attrs.uiReset)ctrl.$setViewValue(scope.$eval(attrs.uiReset));else ctrl.$setViewValue(resetValue);
ctrl.$render()})})}}}]);
angular.module("ui.directives").directive("uiRoute",["$location","$parse",function($location,$parse){return{restrict:"AC",compile:function(tElement,tAttrs){var useProperty;if(tAttrs.uiRoute)useProperty="uiRoute";else if(tAttrs.ngHref)useProperty="ngHref";else if(tAttrs.href)useProperty="href";else throw new Error("uiRoute missing a route or href property on "+tElement[0]);return function($scope,elm,attrs){var modelSetter=$parse(attrs.ngModel||attrs.routeModel||"$uiRoute").assign;var watcher=angular.noop;
function staticWatcher(newVal){if((hash=newVal.indexOf("#"))>-1)newVal=newVal.substr(hash+1);watcher=function watchHref(){modelSetter($scope,$location.path().indexOf(newVal)>-1)};watcher()}function regexWatcher(newVal){if((hash=newVal.indexOf("#"))>-1)newVal=newVal.substr(hash+1);watcher=function watchRegex(){var regexp=new RegExp("^"+newVal+"$",["i"]);modelSetter($scope,regexp.test($location.path()))};watcher()}switch(useProperty){case "uiRoute":if(attrs.uiRoute)regexWatcher(attrs.uiRoute);else attrs.$observe("uiRoute",
regexWatcher);break;case "ngHref":if(attrs.ngHref)staticWatcher(attrs.ngHref);else attrs.$observe("ngHref",staticWatcher);break;case "href":staticWatcher(attrs.href)}$scope.$on("$routeChangeSuccess",function(){watcher()})}}}}]);
angular.module("ui.directives").directive("uiScrollfix",["$window",function($window){return{link:function(scope,elm,attrs){var top=elm.offset().top;if(!attrs.uiScrollfix)attrs.uiScrollfix=top;else if(attrs.uiScrollfix.charAt(0)==="-")attrs.uiScrollfix=top-attrs.uiScrollfix.substr(1);else if(attrs.uiScrollfix.charAt(0)==="+")attrs.uiScrollfix=top+parseFloat(attrs.uiScrollfix.substr(1));angular.element($window).on("scroll.ui-scrollfix",function(){var offset;if(angular.isDefined($window.pageYOffset))offset=
$window.pageYOffset;else{var iebody=document.compatMode&&document.compatMode!=="BackCompat"?document.documentElement:document.body;offset=iebody.scrollTop}if(!elm.hasClass("ui-scrollfix")&&offset>attrs.uiScrollfix)elm.addClass("ui-scrollfix");else if(elm.hasClass("ui-scrollfix")&&offset<attrs.uiScrollfix)elm.removeClass("ui-scrollfix")})}}}]);
angular.module("ui.directives").directive("uiSelect2",["ui.config","$timeout",function(uiConfig,$timeout){var options={};if(uiConfig.select2)angular.extend(options,uiConfig.select2);return{require:"?ngModel",compile:function(tElm,tAttrs){var watch,repeatOption,repeatAttr,isSelect=tElm.is("select"),isMultiple=tAttrs.multiple!==undefined;if(tElm.is("select")){repeatOption=tElm.find("option[ng-repeat], option[data-ng-repeat]");if(repeatOption.length){repeatAttr=repeatOption.attr("ng-repeat")||repeatOption.attr("data-ng-repeat");
watch=jQuery.trim(repeatAttr.split("|")[0]).split(" ").pop()}}return function(scope,elm,attrs,controller){var opts=angular.extend({},options,scope.$eval(attrs.uiSelect2));if(isSelect){delete opts.multiple;delete opts.initSelection}else if(isMultiple)opts.multiple=true;if(controller){controller.$render=function(){if(isSelect)elm.select2("val",controller.$modelValue);else if(isMultiple)if(!controller.$modelValue)elm.select2("data",[]);else if(angular.isArray(controller.$modelValue))elm.select2("data",
controller.$modelValue);else elm.select2("val",controller.$modelValue);else if(angular.isObject(controller.$modelValue))elm.select2("data",controller.$modelValue);else elm.select2("val",controller.$modelValue)};if(watch)scope.$watch(watch,function(newVal,oldVal,scope){if(!newVal)return;$timeout(function(){elm.select2("val",controller.$viewValue);elm.trigger("change")})});if(!isSelect){elm.bind("change",function(){scope.$apply(function(){controller.$setViewValue(elm.select2("data"))})});if(opts.initSelection){var initSelection=
opts.initSelection;opts.initSelection=function(element,callback){initSelection(element,function(value){controller.$setViewValue(value);callback(value)})}}}}attrs.$observe("disabled",function(value){elm.select2(value&&"disable"||"enable")});if(attrs.ngMultiple)scope.$watch(attrs.ngMultiple,function(newVal){elm.select2(opts)});elm.val(scope.$eval(attrs.ngModel));$timeout(function(){elm.select2(opts);if(!opts.initSelection&&!isSelect)controller.$setViewValue(elm.select2("data"))})}}}}]);
angular.module("ui.directives").directive("uiShow",[function(){return function(scope,elm,attrs){scope.$watch(attrs.uiShow,function(newVal,oldVal){if(newVal)elm.addClass("ui-show");else elm.removeClass("ui-show")})}}]).directive("uiHide",[function(){return function(scope,elm,attrs){scope.$watch(attrs.uiHide,function(newVal,oldVal){if(newVal)elm.addClass("ui-hide");else elm.removeClass("ui-hide")})}}]).directive("uiToggle",[function(){return function(scope,elm,attrs){scope.$watch(attrs.uiToggle,function(newVal,
oldVal){if(newVal)elm.removeClass("ui-hide").addClass("ui-show");else elm.removeClass("ui-show").addClass("ui-hide")})}}]);
angular.module("ui.directives").directive("uiSortable",["ui.config",function(uiConfig){return{require:"?ngModel",link:function(scope,element,attrs,ngModel){var onReceive,onRemove,onStart,onUpdate,opts,_receive,_remove,_start,_update;opts=angular.extend({},uiConfig.sortable,scope.$eval(attrs.uiSortable));if(ngModel){ngModel.$render=function(){element.sortable("refresh")};onStart=function(e,ui){ui.item.sortable={index:ui.item.index()}};onUpdate=function(e,ui){ui.item.sortable.resort=ngModel};onReceive=
function(e,ui){ui.item.sortable.relocate=true;ngModel.$modelValue.splice(ui.item.index(),0,ui.item.sortable.moved)};onRemove=function(e,ui){if(ngModel.$modelValue.length===1)ui.item.sortable.moved=ngModel.$modelValue.splice(0,1)[0];else ui.item.sortable.moved=ngModel.$modelValue.splice(ui.item.sortable.index,1)[0]};onStop=function(e,ui){if(ui.item.sortable.resort&&!ui.item.sortable.relocate){var end,start;start=ui.item.sortable.index;end=ui.item.index();if(start<end)end--;ui.item.sortable.resort.$modelValue.splice(end,
0,ui.item.sortable.resort.$modelValue.splice(start,1)[0])}if(ui.item.sortable.resort||ui.item.sortable.relocate)scope.$apply()};_start=opts.start;opts.start=function(e,ui){onStart(e,ui);if(typeof _start==="function")_start(e,ui)};_stop=opts.stop;opts.stop=function(e,ui){onStop(e,ui);if(typeof _stop==="function")_stop(e,ui)};_update=opts.update;opts.update=function(e,ui){onUpdate(e,ui);if(typeof _update==="function")_update(e,ui)};_receive=opts.receive;opts.receive=function(e,ui){onReceive(e,ui);if(typeof _receive===
"function")_receive(e,ui)};_remove=opts.remove;opts.remove=function(e,ui){onRemove(e,ui);if(typeof _remove==="function")_remove(e,ui)}}element.sortable(opts)}}}]);
angular.module("ui.directives").directive("uiTinymce",["ui.config",function(uiConfig){uiConfig.tinymce=uiConfig.tinymce||{};return{require:"ngModel",link:function(scope,elm,attrs,ngModel){var expression,options={onchange_callback:function(inst){if(inst.isDirty()){inst.save();ngModel.$setViewValue(elm.val());if(!scope.$$phase)scope.$apply()}},handle_event_callback:function(e){if(this.isDirty()){this.save();ngModel.$setViewValue(elm.val());if(!scope.$$phase)scope.$apply()}return true},setup:function(ed){ed.onSetContent.add(function(ed,
o){if(ed.isDirty()){ed.save();ngModel.$setViewValue(elm.val());if(!scope.$$phase)scope.$apply()}})}};if(attrs.uiTinymce)expression=scope.$eval(attrs.uiTinymce);else expression={};angular.extend(options,uiConfig.tinymce,expression);setTimeout(function(){elm.tinymce(options)})}}}]);
angular.module("ui.directives").directive("uiValidate",function(){return{restrict:"A",require:"ngModel",link:function(scope,elm,attrs,ctrl){var validateFn,watch,validators={},validateExpr=scope.$eval(attrs.uiValidate);if(!validateExpr)return;if(angular.isString(validateExpr))validateExpr={validator:validateExpr};angular.forEach(validateExpr,function(expression,key){validateFn=function(valueToValidate){if(scope.$eval(expression,{"$value":valueToValidate})){ctrl.$setValidity(key,true);return valueToValidate}else{ctrl.$setValidity(key,
false);return undefined}};validators[key]=validateFn;ctrl.$formatters.push(validateFn);ctrl.$parsers.push(validateFn)});if(attrs.uiValidateWatch){watch=scope.$eval(attrs.uiValidateWatch);if(angular.isString(watch))scope.$watch(watch,function(){angular.forEach(validators,function(validatorFn,key){validatorFn(ctrl.$modelValue)})});else angular.forEach(watch,function(expression,key){scope.$watch(expression,function(){validators[key](ctrl.$modelValue)})})}}}});
angular.module("ui.filters").filter("format",function(){return function(value,replace){if(!value)return value;var target=value.toString(),token;if(replace===undefined)return target;if(!angular.isArray(replace)&&!angular.isObject(replace))return target.split("$0").join(replace);token=angular.isArray(replace)&&"$"||":";angular.forEach(replace,function(value,key){target=target.split(token+key).join(value)});return target}});
angular.module("ui.filters").filter("highlight",function(){return function(text,search,caseSensitive){if(search||angular.isNumber(search)){text=text.toString();search=search.toString();if(caseSensitive)return text.split(search).join('<span class="ui-match">'+search+"</span>");else return text.replace(new RegExp(search,"gi"),'<span class="ui-match">$&</span>')}else return text}});
angular.module("ui.filters").filter("inflector",function(){function ucwords(text){return text.replace(/^([a-z])|\s+([a-z])/g,function($1){return $1.toUpperCase()})}function breakup(text,separator){return text.replace(/[A-Z]/g,function(match){return separator+match})}var inflectors={humanize:function(value){return ucwords(breakup(value," ").split("_").join(" "))},underscore:function(value){return value.substr(0,1).toLowerCase()+breakup(value.substr(1),"_").toLowerCase().split(" ").join("_")},variable:function(value){value=
value.substr(0,1).toLowerCase()+ucwords(value.split("_").join(" ")).substr(1).split(" ").join("");return value}};return function(text,inflector,separator){if(inflector!==false&&angular.isString(text)){inflector=inflector||"humanize";return inflectors[inflector](text)}else return text}});
angular.module("ui.filters").filter("unique",function(){return function(items,filterOn){if(filterOn===false)return items;if((filterOn||angular.isUndefined(filterOn))&&angular.isArray(items)){var hashCheck={},newItems=[];var extractValueToCompare=function(item){if(angular.isObject(item)&&angular.isString(filterOn))return item[filterOn];else return item};angular.forEach(items,function(item){var valueToCheck,isDuplicate=false;for(var i=0;i<newItems.length;i++)if(angular.equals(extractValueToCompare(newItems[i]),
extractValueToCompare(item))){isDuplicate=true;break}if(!isDuplicate)newItems.push(item)});items=newItems}return items}});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment