Created
April 3, 2013 03:03
-
-
Save clouddueling/5298119 to your computer and use it in GitHub Desktop.
X Editable for Bootstrap + Angular UI
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
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