@omostan/angularjs-xeditable
Version:
A customized version of xeditable - a bundle of AngularJS directives that allows you to create editable elements in your projects. Such technique is also known as click-to-edit or edit-in-place.
1 lines • 36.7 kB
JavaScript
angular.module("xeditable",[]).value("editableOptions",{theme:"default",icon_set:"default",buttons:"right",blurElem:"cancel",blurForm:"ignore",activate:"focus",isDisabled:!1,activationEvent:"click",submitButtonTitle:"Submit",submitButtonAriaLabel:"Submit",cancelButtonTitle:"Cancel",cancelButtonAriaLabel:"Cancel",clearButtonTitle:"Clear",clearButtonAriaLabel:"Clear",displayClearButton:!1,displaySubmitButton:!1}),angular.module("xeditable").directive("editableBsdate",["editableDirectiveFactory","$injector","$parse",function(t,e,a){uibDatepickerConfig=e.get("uibDatepickerConfig"),uibDatepickerPopupConfig=e.get("uibDatepickerPopupConfig");var i=[["eIsOpen","is-open"],["eDateDisabled","date-disabled"],["eDatepickerPopup","uib-datepicker-popup"],["eShowButtonBar","show-button-bar"],["eCurrentText","current-text"],["eClearText","clear-text"],["eCloseText","close-text"],["eCloseOnDateSelection","close-on-date-selection"],["eDatepickerAppendToBody","datepicker-append-to-body"],["eOnOpenFocus","on-open-focus"],["eName","name"],["eDateDisabled","date-disabled"],["eAltInputFormats","alt-input-formats"]],n=[["eFormatDay","formatDay"],["eFormatMonth","formatMonth"],["eFormatYear","formatYear"],["eFormatDayHeader","formatDayHeader"],["eFormatDayTitle","formatDayTitle"],["eFormatMonthTitle","formatMonthTitle"],["eMaxMode","maxMode"],["eMinMode","minMode"],["eDatepickerMode","datepickerMode"]];return t({directiveName:"editableBsdate",inputTpl:"<div></div>",render:function(){this.parent.render.call(this);var t=this.attrs,e=this.scope,r=angular.element('<input type="text" class="form-control" ng-model="$parent.$data"/>');r.attr("uib-datepicker-popup",t.eDatepickerPopupXEditable||uibDatepickerPopupConfig.datepickerPopup),r.attr("year-range",t.eYearRange||20),r.attr("ng-readonly",t.eReadonly||!1);for(var o=i.length-1;o>=0;o--){var l=t[i[o][0]];void 0!==l&&r.attr(i[o][1],l)}t.eNgChange&&(r.attr("ng-change",t.eNgChange),this.inputEl.removeAttr("ng-change")),t.eStyle&&(r.attr("style",t.eStyle),this.inputEl.removeAttr("style"));var s={maxDate:e.$eval(t.eMaxDate)||uibDatepickerConfig.maxDate,minDate:e.$eval(t.eMinDate)||uibDatepickerConfig.minDate,showWeeks:t.eShowWeeks?"true"===t.eShowWeeks.toLowerCase():uibDatepickerConfig.showWeeks,startingDay:t.eStartingDay||0,initDate:e.$eval(t.eInitDate)||new Date};if(t.eDatepickerOptions){var u=a(t.eDatepickerOptions)(e);angular.extend(s,u)}for(var c=n.length-1;c>=0;c--){var d=t[n[c][0]];void 0!==d&&(s[n[c][1]]=d)}if(e.dateOptions=s,"true"===(angular.isDefined(t.eShowCalendarButton)?t.eShowCalendarButton:"true")){var p=angular.element('<button type="button" class="btn btn-default"><i class="glyphicon glyphicon-calendar"></i></button>'),h=angular.element('<span class="input-group-btn"></span>');p.attr("ng-click",t.eNgClick),h.append(p),this.inputEl.append(h)}else r.attr("ng-click",t.eNgClick);r.attr("datepicker-options","dateOptions"),this.inputEl.prepend(r),this.inputEl.removeAttr("class"),this.inputEl.removeAttr("ng-click"),this.inputEl.removeAttr("is-open"),this.inputEl.removeAttr("init-date"),this.inputEl.removeAttr("datepicker-popup"),this.inputEl.removeAttr("required"),this.inputEl.removeAttr("ng-model"),this.inputEl.removeAttr("date-picker-append-to-body"),this.inputEl.removeAttr("name"),this.inputEl.attr("class","input-group")},autosubmit:function(){var t=this;t.inputEl.bind("change",function(){setTimeout(function(){t.scope.$apply(function(){t.scope.$form.$submit()})},500)}),t.inputEl.bind("keydown",function(e){9===e.keyCode&&"submit"===t.editorEl.attr("blur")&&t.scope.$apply(function(){t.scope.$form.$submit()})})}})}]),angular.module("xeditable").directive("editableBstime",["editableDirectiveFactory",function(t){return t({directiveName:"editableBstime",inputTpl:"<div uib-timepicker></div>",render:function(){this.parent.render.call(this);var t=angular.element('<div class="well well-small" style="display:inline-block;"></div>');t.attr("ng-model",this.inputEl.attr("ng-model")),this.inputEl.removeAttr("ng-model"),this.attrs.eNgChange&&(t.attr("ng-change",this.inputEl.attr("ng-change")),this.inputEl.removeAttr("ng-change")),this.inputEl.wrap(t)}})}]),angular.module("xeditable").directive("editableCheckbox",["editableDirectiveFactory",function(t){return t({directiveName:"editableCheckbox",inputTpl:'<input type="checkbox">',render:function(){this.parent.render.call(this),this.inputEl.wrap("<label></label>"),this.attrs.eTitle&&this.inputEl.parent().append("<span>"+this.attrs.eTitle+"</span>")},autosubmit:function(){var t=this;t.inputEl.bind("change",function(){setTimeout(function(){t.scope.$apply(function(){t.scope.$form.$submit()})},500)})}})}]),angular.module("xeditable").directive("editableChecklist",["editableDirectiveFactory","editableNgOptionsParser",function(t,e){return t({directiveName:"editableChecklist",inputTpl:"<span></span>",useCopy:!0,render:function(){this.parent.render.call(this);var t=e(this.attrs.eNgOptions),a="",i="";this.attrs.eNgChange&&(a=' ng-change="'+this.attrs.eNgChange+'"'),this.attrs.eChecklistComparator&&(i=' checklist-comparator="'+this.attrs.eChecklistComparator+'"');var n='<label ng-repeat="'+t.ngRepeat+'"><input type="checkbox" checklist-model="$parent.$parent.$data" checklist-value="'+t.locals.valueFn+'"'+a+i+'><span ng-bind="'+t.locals.displayFn+'"></span></label>';this.inputEl.removeAttr("ng-model"),this.inputEl.removeAttr("ng-options"),this.inputEl.removeAttr("ng-change"),this.inputEl.removeAttr("checklist-comparator"),this.inputEl.html(n)}})}]),angular.module("xeditable").directive("editableCombodate",["editableDirectiveFactory","editableCombodate",function(t,e){return t({directiveName:"editableCombodate",inputTpl:'<input type="text">',render:function(){this.parent.render.call(this);var t={value:new Date(this.scope.$data)},a=this;angular.forEach(["format","template","minYear","maxYear","yearDescending","minuteStep","secondStep","firstItem","errorClass","customClass","roundTime","smartDays"],function(e){var i="e"+e.charAt(0).toUpperCase()+e.slice(1);i in a.attrs&&(t[e]="minYear"==e||"maxYear"==e||"minuteStep"==e||"secondStep"==e?parseInt(a.attrs[i],10):a.attrs[i])});var i=e.getInstance(this.inputEl,t);i.$widget.find("select").bind("change",function(t){a.scope.$data=i.getValue()?new Date(i.getValue().replace(/-/g,"/")).toISOString():null}).change()}})}]),function(){var t="text|password|email|tel|number|url|search|color|date|datetime|datetime-local|time|month|week|file".split("|");angular.forEach(t,function(t){var e=("editable-"+t).toLowerCase().replace(/-(.)/g,function(t,e){return e.toUpperCase()});angular.module("xeditable").directive(e,["editableDirectiveFactory",function(a){return a({directiveName:e,inputTpl:'<input type="'+t+'">',render:function(){if(this.parent.render.call(this),this.attrs.eInputgroupleft||this.attrs.eInputgroupright){if(this.inputEl.wrap('<div class="input-group"></div>'),this.attrs.eInputgroupleft){var t=angular.element('<span class="input-group-addon">'+this.attrs.eInputgroupleft+"</span>");this.inputEl.parent().prepend(t)}if(this.attrs.eInputgroupright){var e=angular.element('<span class="input-group-addon">'+this.attrs.eInputgroupright+"</span>");this.inputEl.parent().append(e)}}if(this.attrs.eLabel){var a=angular.element("<label>"+this.attrs.eLabel+"</label>");this.attrs.eInputgroupleft||this.attrs.eInputgroupright?this.inputEl.parent().parent().prepend(a):this.inputEl.parent().prepend(a)}this.attrs.eFormclass&&(this.editorEl.addClass(this.attrs.eFormclass),this.inputEl.removeAttr("formclass"))},autosubmit:function(){var t=this;t.inputEl.bind("keydown",function(e){9===e.keyCode&&"submit"===t.editorEl.attr("blur")&&t.scope.$apply(function(){t.scope.$form.$submit()})})}})}])}),angular.module("xeditable").directive("editableRange",["editableDirectiveFactory","$interpolate",function(t,e){return t({directiveName:"editableRange",inputTpl:'<input type="range" id="range" name="range">',render:function(){this.parent.render.call(this),this.inputEl.after("<output>"+e.startSymbol()+"$data"+e.endSymbol()+"</output>")}})}])}(),angular.module("xeditable").directive("editableTagsInput",["editableDirectiveFactory","editableUtils",function(t,e){var a=t({directiveName:"editableTagsInput",inputTpl:"<tags-input></tags-input>",useCopy:!0,render:function(){this.parent.render.call(this),this.inputEl.append(e.rename("auto-complete",this.attrs.$autoCompleteElement)),this.inputEl.removeAttr("ng-model"),this.inputEl.attr("ng-model","$parent.$data")}}),i=a.link;return a.link=function(t,e,a,n){var r=e.find("editable-tags-input-auto-complete");return a.$autoCompleteElement=r.clone(),r.remove(),i(t,e,a,n)},a}]),angular.module("xeditable").directive("editableRadiolist",["editableDirectiveFactory","editableNgOptionsParser","$interpolate",function(t,e,a){return t({directiveName:"editableRadiolist",inputTpl:"<span></span>",render:function(){this.parent.render.call(this);var t=e(this.attrs.eNgOptions),i="",n="";this.attrs.eNgChange&&(i=' ng-change="'+this.attrs.eNgChange+'"'),this.attrs.eName&&(n=' name="'+this.attrs.eName+'"');var r='<label data-ng-repeat="'+t.ngRepeat+'"><input type="radio" data-ng-disabled="::'+this.attrs.eNgDisabled+'" data-ng-model="$parent.$parent.$data" data-ng-value="'+a.startSymbol()+"::"+t.locals.valueFn+a.endSymbol()+'"'+i+n+'><span data-ng-bind="::'+t.locals.displayFn+'"></span></label>';this.inputEl.removeAttr("ng-model"),this.inputEl.removeAttr("ng-options"),this.inputEl.removeAttr("ng-change"),this.inputEl.html(r)},autosubmit:function(){var t=this;t.inputEl.bind("change",function(){setTimeout(function(){t.scope.$apply(function(){t.scope.$form.$submit()})},500)})}})}]),angular.module("xeditable").directive("editableSelect",["editableDirectiveFactory",function(t){return t({directiveName:"editableSelect",inputTpl:"<select></select>",render:function(){if(this.parent.render.call(this),this.attrs.ePlaceholder){var t=angular.element('<option value="">'+this.attrs.ePlaceholder+"</option>");this.inputEl.append(t)}},autosubmit:function(){var t=this;t.attrs.hasOwnProperty("eMultiple")||t.inputEl.bind("change",function(){t.scope.$apply(function(){t.scope.$form.$submit()})})}})}]),angular.module("xeditable").directive("editableTextarea",["editableDirectiveFactory",function(t){return t({directiveName:"editableTextarea",inputTpl:"<textarea></textarea>",render:function(){this.parent.render.call(this),this.attrs.eFormclass&&(this.editorEl.addClass(this.attrs.eFormclass),this.inputEl.removeAttr("formclass"))},addListeners:function(){this.parent.addListeners.call(this),this.single&&"no"!==this.buttons&&this.autosubmit()},autosubmit:function(){var t=this;t.inputEl.bind("keydown",function(e){t.attrs.submitOnEnter?13!==e.keyCode||e.shiftKey||t.scope.$apply(function(){t.scope.$form.$submit()}):((e.ctrlKey||e.metaKey)&&13===e.keyCode||9===e.keyCode&&"submit"===t.editorEl.attr("blur"))&&t.scope.$apply(function(){t.scope.$form.$submit()})})}})}]),angular.module("xeditable").directive("editableUidate",["editableDirectiveFactory",function(t){return t({directiveName:"editableUidate",inputTpl:'<input class="form-control" />',render:function(){this.parent.render.call(this),this.inputEl.attr("ui-date",this.attrs.eUiDate),this.inputEl.attr("placeholder",this.attrs.ePlaceholder)}})}]),angular.module("xeditable").directive("editableUiSelect",["editableDirectiveFactory","editableUtils",function(t,e){var a=t({directiveName:"editableUiSelect",inputTpl:"<ui-select></ui-select>",render:function(){this.parent.render.call(this),this.inputEl.append(e.rename("ui-select-match",this.attrs.$matchElement)),this.inputEl.append(e.rename("ui-select-choices",this.attrs.$choicesElement)),this.inputEl.removeAttr("ng-model"),this.inputEl.attr("ng-model","$parent.$parent.$data")},autosubmit:function(){var t=this;t.inputEl.bind("change",function(){setTimeout(function(){t.scope.$apply(function(){t.scope.$form.$submit()})},500)}),t.inputEl.bind("keydown",function(e){9===e.keyCode&&"submit"===t.editorEl.attr("blur")&&t.scope.$apply(function(){t.scope.$form.$submit()})})}}),i=a.link;return a.link=function(t,e,a,n){var r=e.find("editable-ui-select-match"),o=e.find("editable-ui-select-choices");return a.$matchElement=r.clone(),a.$choicesElement=o.clone(),r.remove(),o.remove(),i(t,e,a,n)},a}]),angular.module("xeditable").factory("editableController",["$q","editableUtils",function(t,e){function a(t,a,i,n,r,o,l,s,u,c,d,p){var h,m,b=this;b.scope=t,b.elem=i,b.attrs=a,b.inputEl=null,b.editorEl=null,b.single=!0,b.error="",b.theme=r[a.editableTheme]||r[l.theme]||r.default,b.parent={};var f=a.editableTheme||l.theme||"default",g=a.editableIconSet||l.icon_set;b.icon_set="default"===g?o.default[f]:o.external[g],b.inputTpl="",b.directiveName="",b.useCopy=!1,b.single=null,b.buttons="right",b.popover=!1,b.init=function(e){if(b.single=e,b.name=a.eName||a[b.directiveName],!a[b.directiveName])throw"You should provide value for `"+b.directiveName+"` in editable element!";h=n(a[b.directiveName]),b.single?b.buttons=b.attrs.buttons||l.buttons:b.buttons="no",a.eName&&b.scope.$watch("$data",function(t){b.scope.$form.$data[a.eName]=t}),a.onshow&&(b.onshow=function(){return b.catchError(n(a.onshow)(t))}),a.onhide&&(b.onhide=function(){return n(a.onhide)(t)}),a.oncancel&&(b.oncancel=function(){return n(a.oncancel)(t)}),a.onbeforesave&&(b.onbeforesave=function(){return b.catchError(n(a.onbeforesave)(t))}),a.onaftersave&&(b.onaftersave=function(){return b.catchError(n(a.onaftersave)(t))}),a.popover&&(b.popover=b.attrs.popover),t.$parent.$watch(a[b.directiveName],function(t,e){b.setLocalValue(),b.handleEmpty()})},b.render=function(){var t=b.theme;for(var i in b.inputEl=angular.element(b.inputTpl),b.controlsEl=angular.element(t.controlsTpl),b.controlsEl.append(b.inputEl),"no"!==b.buttons&&(b.buttonsEl=angular.element(t.buttonsTpl),b.submitEl=angular.element(t.submitTpl),b.resetEl=angular.element(t.resetTpl),b.cancelEl=angular.element(t.cancelTpl),b.submitEl.attr("title",l.submitButtonTitle),b.submitEl.attr("aria-label",l.submitButtonAriaLabel),b.cancelEl.attr("title",l.cancelButtonTitle),b.cancelEl.attr("aria-label",l.cancelButtonAriaLabel),b.resetEl.attr("title",l.clearButtonTitle),b.resetEl.attr("aria-label",l.clearButtonAriaLabel),b.icon_set&&(b.submitEl.find("span").addClass(b.icon_set.ok),b.cancelEl.find("span").addClass(b.icon_set.cancel),b.resetEl.find("span").addClass(b.icon_set.clear)),void 0!==b.attrs.displaySubmitButton?"true"===b.attrs.displaySubmitButton?b.buttonsEl.append(b.submitEl).append(b.cancelEl):b.buttonsEl.append(b.cancelEl):l.displaySubmitButton?b.buttonsEl.append(b.submitEl).append(b.cancelEl):b.buttonsEl.append(b.cancelEl),l.displayClearButton&&b.buttonsEl.append(b.resetEl),b.controlsEl.append(b.buttonsEl),b.inputEl.addClass("editable-has-buttons")),b.errorEl=angular.element(t.errorTpl),b.controlsEl.append(b.errorEl),b.editorEl=angular.element(b.single?t.formTpl:t.noformTpl),b.editorEl.append(b.controlsEl),a.$attr)if(!(i.length<=1)){var n=!1,r=i.substring(1,2);if("e"===i.substring(0,1)&&r===r.toUpperCase()&&"Form"!==(n=i.substring(1))&&"NgSubmit"!==n){var o=n.substring(0,1),s=n.substring(1,2),u="value"!==(n=s===s.toUpperCase()&&o===o.toUpperCase()?o.toLowerCase()+"-"+e.camelToDash(n.substring(1)):o.toLowerCase()+e.camelToDash(n.substring(1)))&&""===a[i]?n:a[i];b.inputEl.attr(n,u)}}if(b.inputEl.addClass("editable-input"),b.inputEl.attr("ng-model","$parent.$data"),b.editorEl.addClass(e.camelToDash(b.directiveName)),b.single&&(b.editorEl.attr("editable-form","$form"),b.editorEl.attr("blur",b.attrs.blur||l.blurElem)),b.popover){var c=angular.element("<div></div>");c.append(b.editorEl),b.editorEl=c,p.put("popover.html",b.editorEl[0].outerHTML)}angular.isFunction(t.postrender)&&t.postrender.call(b)},b.setLocalValue=function(){b.scope.$data=b.useCopy?angular.copy(h(t.$parent)):h(t.$parent)};var v=null;b.show=function(){return b.setLocalValue(),b.render(),i.after(b.editorEl),v=t.$new(),u(b.editorEl)(v),b.addListeners(),i.addClass("editable-hide"),b.onshow()},b.hide=function(){return v.$destroy(),b.controlsEl.remove(),b.editorEl.remove(),i.removeClass("editable-hide"),b.popover&&p.remove("popover.html"),b.onhide()},b.cancel=function(){b.oncancel()},b.addListeners=function(){b.inputEl.bind("keyup",function(t){if(b.single)switch(t.keyCode){case 27:b.scope.$apply(function(){b.scope.$form.$cancel()})}}),b.single&&"no"===b.buttons&&b.autosubmit(),b.editorEl.bind("click",function(t){t.which&&1!==t.which||b.scope.$form.$visible&&(b.scope.$form._clicked=!0)})},b.setWaiting=function(t){t?(m=!b.inputEl.attr("disabled")&&!b.inputEl.attr("ng-disabled")&&!b.inputEl.attr("ng-enabled"))&&(b.inputEl.attr("disabled","disabled"),b.buttonsEl&&b.buttonsEl.find("button").attr("disabled","disabled")):m&&(b.inputEl.removeAttr("disabled"),b.buttonsEl&&b.buttonsEl.find("button").removeAttr("disabled"))},b.activate=function(t,e){setTimeout(function(){var a=b.inputEl[0];"focus"===l.activate&&a.focus?(void 0!==t&&""!==t&&a.setSelectionRange&&(e=e||t,a.onfocus=function(){setTimeout(function(){try{this.setSelectionRange(t,e)}catch(t){}}.bind(this))}),"editableRadiolist"==b.directiveName||"editableChecklist"==b.directiveName||"editableBsdate"==b.directiveName||"editableTagsInput"==b.directiveName?a.querySelector(".ng-pristine").focus():a.focus()):"select"===l.activate&&(a.select?a.select():a.focus&&a.focus())},0)},b.setError=function(e){angular.isObject(e)||(t.$error=d.trustAsHtml(e),b.error=e)},b.catchError=function(t,e){return angular.isObject(t)&&!0!==e?c.when(t).then(angular.bind(this,function(t){this.catchError(t,!0)}),angular.bind(this,function(t){this.catchError(t,!0)})):e&&angular.isObject(t)&&t.status&&200!==t.status&&t.data&&angular.isString(t.data)?(this.setError(t.data),t=t.data):angular.isString(t)&&this.setError(t),t},b.save=function(){h.assign(t.$parent,b.useCopy?angular.copy(b.scope.$data):b.scope.$data)},b.handleEmpty=function(){var e=h(t.$parent),a=null==e||""===e||angular.isArray(e)&&0===e.length;i.toggleClass("editable-empty",a)},b.autosubmit=angular.noop,b.onshow=angular.noop,b.onhide=angular.noop,b.oncancel=angular.noop,b.onbeforesave=angular.noop,b.onaftersave=angular.noop}return a.$inject=["$scope","$attrs","$element","$parse","editableThemes","editableIcons","editableOptions","$rootScope","$compile","$q","$sce","$templateCache"],a}]),angular.module("xeditable").factory("editableDirectiveFactory",["$parse","$compile","editableThemes","$rootScope","$document","editableController","editableFormController","editableOptions",function(t,e,a,i,n,r,o,l){return function(e){return{restrict:"A",scope:!0,require:[e.directiveName,"?^form"],controller:r,link:function(a,r,s,u){var c,d=u[0],p=!1;if(u[1])c=u[1],p=void 0===s.eSingle;else if(s.eForm){var h=t(s.eForm)(a);if(h)c=h,p=!0;else if(r&&"function"==typeof r.parents&&r.parents().last().find('form[name="'+s.eForm+'"]').length)c=null,p=!0;else for(var m=0;m<n[0].forms.length;m++)if(n[0].forms[m].name===s.eForm){c=null,p=!0;break}}angular.forEach(e,function(t,e){void 0!==d[e]&&(d.parent[e]=d[e])}),angular.extend(d,e);if(d.init(!p),a.$editable=d,r.addClass("editable"),p)if(c){if(a.$form=c,!a.$form.$addEditable)throw"Form with editable elements should have `editable-form` attribute.";a.$form.$addEditable(d)}else i.$$editableBuffer=i.$$editableBuffer||{},i.$$editableBuffer[s.eForm]=i.$$editableBuffer[s.eForm]||[],i.$$editableBuffer[s.eForm].push(d),a.$form=null;else a.$form=o(),a.$form.$addEditable(d),s.eForm&&(t(s.eForm).assign||angular.noop)(a.$parent,a.$form),s.eForm&&!s.eClickable||(r.addClass("editable-click"),r.bind(l.activationEvent,function(t){t.preventDefault(),t.editable=d,(angular.isDefined(s.editDisabled)?a.$eval(s.editDisabled):l.isDisabled)||a.$apply(function(){a.$form.$show()})}))}}}}]),angular.module("xeditable").factory("editableFormController",["$parse","$document","$rootScope","editablePromiseCollection","editableUtils",function(t,e,a,i,n){var r=[],o=function(t,e){var a=!0,i=t.$editables;return angular.forEach(i,function(t){(function(t,e){if(e==t)return!0;for(var a=e.parentNode;null!==a;){if(a==t)return!0;a=a.parentNode}return!1})(t.editorEl[0],e.target)&&(a=!1)}),a};e.bind("click",function(t){if(!t.which||1===t.which){for(var e=[],i=[],n=0;n<r.length;n++)r[n]._clicked?r[n]._clicked=!1:r[n].$waiting||("cancel"===r[n]._blur&&o(r[n],t)&&e.push(r[n]),"submit"===r[n]._blur&&o(r[n],t)&&i.push(r[n]));(e.length||i.length)&&a.$apply(function(){angular.forEach(e,function(t){t.$cancel()}),angular.forEach(i,function(t){t.$submit()})})}}),a.$on("closeEdit",function(){for(var t=0;t<r.length;t++)r[t].$hide()});var l={$addEditable:function(t){this.$editables.push(t),t.elem.bind("$destroy",angular.bind(this,this.$removeEditable,t)),t.scope.$form||(t.scope.$form=this),this.$visible&&t.catchError(t.show()),t.catchError(t.setWaiting(this.$waiting))},$removeEditable:function(t){for(var e=0;e<this.$editables.length;e++)if(this.$editables[e]===t)return void this.$editables.splice(e,1)},$show:function(){if(!this.$visible){this.$visible=!0;var t=i();t.when(this.$onshow()),this.$setError(null,""),angular.forEach(this.$editables,function(e){t.when(e.show())}),t.then({onWait:angular.bind(this,this.$setWaiting),onTrue:angular.bind(this,this.$activate),onFalse:angular.bind(this,this.$activate),onString:angular.bind(this,this.$activate)}),setTimeout(angular.bind(this,function(){this._clicked=!1,-1===n.indexOf(r,this)&&r.push(this)}),0)}},$activate:function(t){var e,a,i;if(this.$editables.length){if(angular.isString(t))for(e=0;e<this.$editables.length;e++)if(this.$editables[e].name===t)return void this.$editables[e].activate();for(e=0;e<this.$editables.length;e++)if(this.$editables[e].error)return void this.$editables[e].activate();a=this.$editables[0].elem[0].selectionStart?this.$editables[0].elem[0].selectionStart:this.$editables[0].elem[0].text?this.$editables[0].elem[0].text.length:this.$editables[0].elem[0].innerHTML?this.$editables[0].elem[0].innerHTML.length:0,i=this.$editables[0].elem[0].selectionEnd?this.$editables[0].elem[0].selectionEnd:this.$editables[0].elem[0].text?this.$editables[0].elem[0].text.length:this.$editables[0].elem[0].innerHTML?this.$editables[0].elem[0].innerHTML.length:0,this.$editables[0].activate(a,i)}},$hide:function(){this.$visible&&(this.$visible=!1,this.$onhide(),angular.forEach(this.$editables,function(t){t.hide()}),n.arrayRemove(r,this))},$cancel:function(){this.$visible&&(this.$oncancel(),angular.forEach(this.$editables,function(t){t.cancel()}),this.$hide())},$setWaiting:function(t){this.$waiting=!!t,angular.forEach(this.$editables,function(e){e.setWaiting(!!t)})},$setError:function(t,e){angular.forEach(this.$editables,function(a){t&&a.name!==t||a.setError(e)})},$submit:function(){if(!this.$waiting){this.$setError(null,"");var t=i();angular.forEach(this.$editables,function(e){t.when(e.onbeforesave())}),t.then({onWait:angular.bind(this,this.$setWaiting),onTrue:angular.bind(this,e,!0),onFalse:angular.bind(this,e,!1),onString:angular.bind(this,this.$activate)})}function e(t){var e=i();e.when(this.$onbeforesave()),e.then({onWait:angular.bind(this,this.$setWaiting),onTrue:t?angular.bind(this,this.$save):angular.bind(this,this.$hide),onFalse:angular.bind(this,this.$hide),onString:angular.bind(this,this.$activate)})}},$save:function(){angular.forEach(this.$editables,function(t){t.save()});var t=i();t.when(this.$onaftersave()),angular.forEach(this.$editables,function(e){t.when(e.onaftersave())}),t.then({onWait:angular.bind(this,this.$setWaiting),onTrue:angular.bind(this,this.$hide),onFalse:angular.bind(this,this.$hide),onString:angular.bind(this,this.$activate)})},$onshow:angular.noop,$oncancel:angular.noop,$onhide:angular.noop,$onbeforesave:angular.noop,$onaftersave:angular.noop};return function(){return angular.extend({$editables:[],$visible:!1,$waiting:!1,$data:{},_clicked:!1,_blur:null},l)}}]),angular.module("xeditable").directive("editableForm",["$rootScope","$parse","editableFormController","editableOptions",function(t,e,a,i){return{restrict:"A",require:["form"],compile:function(){return{pre:function(e,i,n,r){var o,l=r[0];n.editableForm?e[n.editableForm]&&e[n.editableForm].$show?(o=e[n.editableForm],angular.extend(l,o)):(o=a(),e[n.editableForm]=o,angular.extend(o,l)):(o=a(),angular.extend(l,o));var s=t.$$editableBuffer,u=l.$name;u&&s&&s[u]&&(angular.forEach(s[u],function(t){o.$addEditable(t)}),delete s[u])},post:function(t,a,n,r){var o;o=n.editableForm&&t[n.editableForm]&&t[n.editableForm].$show?t[n.editableForm]:r[0],n.onshow&&(o.$onshow=angular.bind(o,e(n.onshow),t)),n.onhide&&(o.$onhide=angular.bind(o,e(n.onhide),t)),n.oncancel&&(o.$oncancel=angular.bind(o,e(n.oncancel),t)),n.shown&&e(n.shown)(t)&&o.$show(),o._blur=n.blur||i.blurForm,n.ngSubmit||n.submit||(n.onbeforesave&&(o.$onbeforesave=function(){return e(n.onbeforesave)(t,{$data:o.$data})}),n.onaftersave&&(o.$onaftersave=function(){return e(n.onaftersave)(t,{$data:o.$data})}),a.bind("submit",function(e){e.preventDefault(),t.$apply(function(){o.$submit()})})),a.bind("click",function(t){t.which&&1!==t.which||o.$visible&&(o._clicked=!0)})}}}}}]),angular.module("xeditable").factory("editablePromiseCollection",["$q",function(t){return function(){return{promises:[],hasFalse:!1,hasString:!1,when:function(e,a){if(!1===e)this.hasFalse=!0;else if(!a&&angular.isObject(e))this.promises.push(t.when(e));else{if(!angular.isString(e))return;this.hasString=!0}},then:function(e){var a=(e=e||{}).onTrue||angular.noop,i=e.onFalse||angular.noop,n=e.onString||angular.noop,r=e.onWait||angular.noop,o=this;function l(){o.hasString||o.hasFalse?!o.hasString&&o.hasFalse?i():n():a()}this.promises.length?(r(!0),t.all(this.promises).then(function(t){r(!1),angular.forEach(t,function(t){o.when(t,!0)}),l()},function(t){r(!1),n()})):l()}}}}]),angular.module("xeditable").factory("editableUtils",[function(){return{indexOf:function(t,e){if(t.indexOf)return t.indexOf(e);for(var a=0;a<t.length;a++)if(e===t[a])return a;return-1},arrayRemove:function(t,e){var a=this.indexOf(t,e);return a>=0&&t.splice(a,1),e},camelToDash:function(t){return t.replace(/[A-Z]/g,function(t,e){return(e?"-":"")+t.toLowerCase()})},dashToCamel:function(t){return t.replace(/([\:\-\_]+(.))/g,function(t,e,a,i){return i?a.toUpperCase():a}).replace(/^moz([A-Z])/,"Moz$1")},rename:function(t,e){if(e[0]&&e[0].attributes){var a=angular.element("<"+t+"/>");a.html(e.html());for(var i=e[0].attributes,n=0;n<i.length;++n)a.attr(i.item(n).nodeName,i.item(n).value);return a}}}}]),angular.module("xeditable").factory("editableNgOptionsParser",[function(){var t=/^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+(.*?)(?:\s+track\s+by\s+(.*?))?$/;return function(e){var a;if(!(a=e.match(t)))throw"ng-options parse error";var i,n=a[2]||a[1],r=a[4]||a[6],o=a[5],l=(a[3],a[2]?a[1]:r),s=a[7],u=a[8],c=u?a[8]:null;return void 0===o?(i=r+" in "+s,void 0!==u&&(i+=" track by "+c)):i="("+o+", "+r+") in "+s,{ngRepeat:i,locals:{valueName:r,keyName:o,valueFn:l,displayFn:n}}}}]),angular.module("xeditable").factory("editableCombodate",[function(){function t(t,e){if(this.$element=angular.element(t),"INPUT"!=this.$element[0].nodeName)throw"Combodate should be applied to INPUT element";var a=(new Date).getFullYear();this.defaults={format:"YYYY-MM-DD HH:mm",template:"D / MMM / YYYY H : mm",value:null,minYear:1970,maxYear:a,yearDescending:!0,minuteStep:5,secondStep:1,firstItem:"empty",errorClass:null,customClass:"",roundTime:!0,smartDays:!0},this.options=angular.extend({},this.defaults,e),this.init()}return t.prototype={constructor:t,init:function(){if(this.map={day:["D","date"],month:["M","month"],year:["Y","year"],hour:["[Hh]","hours"],minute:["m","minutes"],second:["s","seconds"],ampm:["[Aa]",""]},this.$widget=angular.element('<span class="combodate"></span>').html(this.getTemplate()),this.initCombos(),this.options.smartDays){var t=this;this.$widget.find("select").bind("change",function(e){(angular.element(e.target).hasClass("month")||angular.element(e.target).hasClass("year"))&&t.fillCombo("day")})}this.$widget.find("select").css("width","auto"),this.$element.css("display","none").after(this.$widget),this.setValue(this.$element.val()||this.options.value)},getTemplate:function(){var t=this.options.template,e=this.options.customClass;return angular.forEach(this.map,function(e,a){e=e[0];var i=new RegExp(e+"+"),n=e.length>1?e.substring(1,2):e;t=t.replace(i,"{"+n+"}")}),t=t.replace(/ /g," "),angular.forEach(this.map,function(a,i){var n=(a=a[0]).length>1?a.substring(1,2):a;t=t.replace("{"+n+"}",'<select class="'+i+" "+e+'"></select>')}),t},initCombos:function(){for(var t in this.map){var e=this.$widget[0].querySelectorAll("."+t);this["$"+t]=e.length?angular.element(e):null,this.fillCombo(t)}},fillCombo:function(t){var e=this["$"+t];if(e){var a=this["fill"+t.charAt(0).toUpperCase()+t.slice(1)](),i=e.val();e.html("");for(var n=0;n<a.length;n++)e.append('<option value="'+a[n][0]+'">'+a[n][1]+"</option>");e.val(i)}},fillCommon:function(t){var e,a=[];if("name"===this.options.firstItem){var i="function"==typeof(e=moment.relativeTime||moment.langData()._relativeTime)[t]?e[t](1,!0,t,!1):e[t];i=i.split(" ").reverse()[0],a.push(["",i])}else"empty"===this.options.firstItem&&a.push(["",""]);return a},fillDay:function(){var t,e,a=this.fillCommon("d"),i=-1!==this.options.template.indexOf("DD"),n=31;if(this.options.smartDays&&this.$month&&this.$year){var r=parseInt(this.$month.val(),10),o=parseInt(this.$year.val(),10);isNaN(r)||isNaN(o)||(n=moment([o,r]).daysInMonth())}for(e=1;e<=n;e++)t=i?this.leadZero(e):e,a.push([e,t]);return a},fillMonth:function(){var t,e,a=this.fillCommon("M"),i=-1!==this.options.template.indexOf("MMMM"),n=-1!==this.options.template.indexOf("MMM"),r=-1!==this.options.template.indexOf("MM");for(e=0;e<=11;e++)t=i?moment().date(1).month(e).format("MMMM"):n?moment().date(1).month(e).format("MMM"):r?this.leadZero(e+1):e+1,a.push([e,t]);return a},fillYear:function(){var t,e,a=[],i=-1!==this.options.template.indexOf("YYYY");for(e=this.options.maxYear;e>=this.options.minYear;e--)t=i?e:(e+"").substring(2),a[this.options.yearDescending?"push":"unshift"]([e,t]);return a=this.fillCommon("y").concat(a)},fillHour:function(){var t,e,a=this.fillCommon("h"),i=-1!==this.options.template.indexOf("h"),n=(this.options.template.indexOf("H"),-1!==this.options.template.toLowerCase().indexOf("hh")),r=i?12:23;for(e=i?1:0;e<=r;e++)t=n?this.leadZero(e):e,a.push([e,t]);return a},fillMinute:function(){var t,e,a=this.fillCommon("m"),i=-1!==this.options.template.indexOf("mm");for(e=0;e<=59;e+=this.options.minuteStep)t=i?this.leadZero(e):e,a.push([e,t]);return a},fillSecond:function(){var t,e,a=this.fillCommon("s"),i=-1!==this.options.template.indexOf("ss");for(e=0;e<=59;e+=this.options.secondStep)t=i?this.leadZero(e):e,a.push([e,t]);return a},fillAmpm:function(){var t=-1!==this.options.template.indexOf("a");this.options.template.indexOf("A");return[["am",t?"am":"AM"],["pm",t?"pm":"PM"]]},getValue:function(t){var e,a={},i=this,n=!1;return angular.forEach(this.map,function(t,e){if("ampm"!==e){var r="day"===e?1:0;return a[e]=i["$"+e]?parseInt(i["$"+e].val(),10):r,isNaN(a[e])?(n=!0,!1):void 0}}),n?"":(this.$ampm&&(12===a.hour?a.hour="am"===this.$ampm.val()?0:12:a.hour="am"===this.$ampm.val()?a.hour:a.hour+12),e=moment([a.year,a.month,a.day,a.hour,a.minute,a.second]),this.highlight(e),null===(t=void 0===t?this.options.format:t)?e.isValid()?e:null:e.isValid()?e.format(t):"")},setValue:function(t){if(t){var e="string"==typeof t?moment(t,this.options.format,!0):moment(t),a=this,i={};e.isValid()&&(angular.forEach(this.map,function(t,a){"ampm"!==a&&(i[a]=e[t[1]]())}),this.$ampm&&(i.hour>=12?(i.ampm="pm",i.hour>12&&(i.hour-=12)):(i.ampm="am",0===i.hour&&(i.hour=12))),angular.forEach(i,function(t,e){a["$"+e]&&("minute"===e&&a.options.minuteStep>1&&a.options.roundTime&&(t=n(a["$"+e],t)),"second"===e&&a.options.secondStep>1&&a.options.roundTime&&(t=n(a["$"+e],t)),a["$"+e].val(t))}),this.options.smartDays&&this.fillCombo("day"),this.$element.val(e.format(this.options.format)).triggerHandler("change"))}function n(t,e){var a={};return angular.forEach(t.children("option"),function(t,i){var n=angular.element(t).attr("value");if(""!==n){var r=Math.abs(n-e);(void 0===a.distance||r<a.distance)&&(a={value:n,distance:r})}}),a.value}},highlight:function(t){t.isValid()?this.options.errorClass?this.$widget.removeClass(this.options.errorClass):this.$widget.find("select").css("border-color",this.borderColor):this.options.errorClass?this.$widget.addClass(this.options.errorClass):(this.borderColor||(this.borderColor=this.$widget.find("select").css("border-color")),this.$widget.find("select").css("border-color","red"))},leadZero:function(t){return t<=9?"0"+t:t},destroy:function(){this.$widget.remove(),this.$element.removeData("combodate").show()}},{getInstance:function(e,a){return new t(e,a)}}}]),angular.module("xeditable").factory("editableIcons",function(){return{default:{bs2:{ok:"icon-ok icon-white",cancel:"icon-remove",clear:"icon-trash"},bs3:{ok:"glyphicon glyphicon-ok",cancel:"glyphicon glyphicon-remove",clear:"glyphicon glyphicon-trash"}},external:{"font-awesome":{ok:"fa fa-check",cancel:"fa fa-times",clear:"fa fa-trash"}}}}),angular.module("xeditable").factory("editableThemes",function(){return{default:{formTpl:'<form class="editable-wrap"></form>',noformTpl:'<span class="editable-wrap"></span>',controlsTpl:'<span class="editable-controls"></span>',inputTpl:"",errorTpl:'<div class="editable-error" data-ng-if="$error" data-ng-bind-html="$error"></div>',buttonsTpl:'<span class="editable-buttons"></span>',submitTpl:'<button type="submit" ng-click="$form.$submit()">save</button>',cancelTpl:'<button type="button" ng-click="$form.$cancel()">cancel</button>',resetTpl:'<button type="reset">clear</button>'},bs2:{formTpl:'<form class="form-inline editable-wrap" role="form"></form>',noformTpl:'<span class="editable-wrap"></span>',controlsTpl:'<div class="editable-controls controls control-group" ng-class="{\'error\': $error}"></div>',inputTpl:"",errorTpl:'<div class="editable-error help-block" data-ng-if="$error" data-ng-bind-html="$error"></div>',buttonsTpl:'<span class="editable-buttons"></span>',submitTpl:'<button type="submit" class="btn btn-primary" ng-click="$form.$submit()"><span></span></button>',cancelTpl:'<button type="button" class="btn" ng-click="$form.$cancel()"><span></span></button>',resetTpl:'<button type="reset" class="btn btn-danger">clear</button>'},bs3:{formTpl:'<form class="form-inline editable-wrap" role="form"></form>',noformTpl:'<span class="editable-wrap"></span>',controlsTpl:'<div class="editable-controls form-group" ng-class="{\'has-error\': $error}"></div>',inputTpl:"",errorTpl:'<div class="editable-error help-block" data-ng-if="$error" data-ng-bind-html="$error"></div>',buttonsTpl:'<span class="editable-buttons"></span>',submitTpl:'<button type="submit" class="btn btn-primary" ng-click="$form.$submit()"><span></span></button>',cancelTpl:'<button type="button" class="btn btn-default" ng-click="$form.$cancel()"><span></span></button>',resetTpl:'<button type="reset" class="btn btn-danger">clear</button>',buttonsClass:"",inputClass:"",postrender:function(){switch(this.directiveName){case"editableText":case"editableSelect":case"editableTextarea":case"editableEmail":case"editableTel":case"editableNumber":case"editableUrl":case"editableSearch":case"editableDate":case"editableDatetime":case"editableBsdate":case"editableTime":case"editableMonth":case"editableWeek":case"editablePassword":case"editableDatetimeLocal":if(this.inputEl.addClass("form-control"),this.theme.inputClass){if(this.inputEl.attr("multiple")&&("input-sm"===this.theme.inputClass||"input-lg"===this.theme.inputClass))break;this.inputEl.addClass(this.theme.inputClass)}break;case"editableCheckbox":this.editorEl.addClass("checkbox")}this.buttonsEl&&this.theme.buttonsClass&&this.buttonsEl.find("button").addClass(this.theme.buttonsClass)}},semantic:{formTpl:'<form class="editable-wrap ui form" ng-class="{\'error\': $error}" role="form"></form>',noformTpl:'<span class="editable-wrap"></span>',controlsTpl:'<div class="editable-controls ui fluid input" ng-class="{\'error\': $error}"></div>',inputTpl:"",errorTpl:'<div class="editable-error ui error message" data-ng-if="$error" data-ng-bind-html="$error"></div>',buttonsTpl:'<span class="mini ui buttons"></span>',submitTpl:'<button type="submit" class="ui primary button"><i class="ui check icon"></i></button>',cancelTpl:'<button type="button" class="ui button" ng-click="$form.$cancel()"><i class="ui cancel icon"></i></button>',resetTpl:'<button type="reset" class="ui button">clear</button>'}}});