/*!
angular-xeditable - 0.1.8
Edit-in-place for angular.js
Build date: 2014-01-10
*/
angular.module( "xeditable", [] )
.value( "editableOptions", {
theme: "default",
buttons: "right",
blurElem: "cancel",
blurForm: "ignore",
activate: "focus"
} ), angular.module( "xeditable" )
.directive( "editableBsdate", [ "editableDirectiveFactory", function ( a ) {
return a( {
directiveName: "editableBsdate",
inputTpl: ''
} )
} ] ), angular.module( "xeditable" )
.directive( "editableBstime", [ "editableDirectiveFactory", function ( a ) {
return a( {
directiveName: "editableBstime",
inputTpl: "",
render: function () {
this.parent.render.call( this );
var a = angular.element( '
' );
a.attr( "ng-model", this.inputEl.attr( "ng-model" ) ), this.inputEl.removeAttr( "ng-model" ), this.attrs.eNgChange && ( a.attr( "ng-change", this.inputEl.attr( "ng-change" ) ), this.inputEl.removeAttr( "ng-change" ) ), this.inputEl.wrap( a )
}
} )
} ] ), angular.module( "xeditable" )
.directive( "editableCheckbox", [ "editableDirectiveFactory", function ( a ) {
return a( {
directiveName: "editableCheckbox",
inputTpl: '',
render: function () {
this.parent.render.call( this ), this.attrs.eTitle && ( this.inputEl.wrap( "" ), this.inputEl.after( angular.element( "" )
.text( this.attrs.eTitle ) ) )
},
autosubmit: function () {
var a = this;
a.inputEl.bind( "change", function () {
setTimeout( function () {
a.scope.$apply( function () {
a.scope.$form.$submit()
} )
}, 500 )
} )
}
} )
} ] ), angular.module( "xeditable" )
.directive( "editableChecklist", [ "editableDirectiveFactory", "editableNgOptionsParser", function ( a, b ) {
return a( {
directiveName: "editableChecklist",
inputTpl: "",
useCopy: !0,
render: function () {
this.parent.render.call( this );
var a = b( this.attrs.eNgOptions ),
c = '';
this.inputEl.removeAttr( "ng-model" ), this.inputEl.removeAttr( "ng-options" ), this.inputEl.html( c )
}
} )
} ] ),
function () {
var a = "text|email|tel|number|url|search|color|date|datetime|time|month|week".split( "|" );
angular.forEach( a, function ( a ) {
var b = "editable" + a.charAt( 0 )
.toUpperCase() + a.slice( 1 );
angular.module( "xeditable" )
.directive( b, [ "editableDirectiveFactory", function ( c ) {
return c( {
directiveName: b,
inputTpl: ''
} )
} ] )
} ), angular.module( "xeditable" )
.directive( "editableRange", [ "editableDirectiveFactory", function ( a ) {
return a( {
directiveName: "editableRange",
inputTpl: '',
render: function () {
this.parent.render.call( this ), this.inputEl.after( "" )
}
} )
} ] )
}(), angular.module( "xeditable" )
.directive( "editableRadiolist", [ "editableDirectiveFactory", "editableNgOptionsParser", function ( a, b ) {
return a( {
directiveName: "editableRadiolist",
inputTpl: "",
render: function () {
this.parent.render.call( this );
var a = b( this.attrs.eNgOptions ),
c = '';
this.inputEl.removeAttr( "ng-model" ), this.inputEl.removeAttr( "ng-options" ), this.inputEl.html( c )
},
autosubmit: function () {
var a = this;
a.inputEl.bind( "change", function () {
setTimeout( function () {
a.scope.$apply( function () {
a.scope.$form.$submit()
} )
}, 500 )
} )
}
} )
} ] ), angular.module( "xeditable" )
.directive( "editableSelect", [ "editableDirectiveFactory", function ( a ) {
return a( {
directiveName: "editableSelect",
inputTpl: "",
autosubmit: function () {
var a = this;
a.inputEl.bind( "change", function () {
a.scope.$apply( function () {
a.scope.$form.$submit()
} )
} )
}
} )
} ] ), angular.module( "xeditable" )
.directive( "editableTextarea", [ "editableDirectiveFactory", function ( a ) {
return a( {
directiveName: "editableTextarea",
inputTpl: "",
addListeners: function () {
var a = this;
a.parent.addListeners.call( a ), a.single && "no" !== a.buttons && a.autosubmit()
},
autosubmit: function () {
var a = this;
a.inputEl.bind( "keydown", function ( b ) {
( b.ctrlKey || b.metaKey ) && 13 === b.keyCode && a.scope.$apply( function () {
a.scope.$form.$submit()
} )
} )
}
} )
} ] ), angular.module( "xeditable" )
.factory( "editableController", [ "$q", "editableUtils", function ( a, b ) {
function c( a, c, d, e, f, g, h, i, j ) {
var k, l, m = this;
m.scope = a, m.elem = d, m.attrs = c, m.inputEl = null, m.editorEl = null, m.single = !0, m.error = "", m.theme = f[ g.theme ] || f[ "default" ], m.parent = {}, m.inputTpl = "", m.directiveName = "", m.useCopy = !1, m.single = null, m.buttons = "right", m.init = function ( b ) {
if ( m.single = b, m.name = c.eName || c[ m.directiveName ], !c[ m.directiveName ] ) throw "You should provide value for `" + m.directiveName + "` in editable element!";
k = e( c[ m.directiveName ] ), m.buttons = m.single ? m.attrs.buttons || g.buttons : "no", c.eName && m.scope.$watch( "$data", function ( a ) {
m.scope.$form.$data[ c.eName ] = a
} ), c.onshow && ( m.onshow = function () {
return m.catchError( e( c.onshow )( a ) )
} ), c.onhide && ( m.onhide = function () {
return e( c.onhide )( a )
} ), c.oncancel && ( m.oncancel = function () {
return e( c.oncancel )( a )
} ), c.onbeforesave && ( m.onbeforesave = function () {
return m.catchError( e( c.onbeforesave )( a ) )
} ), c.onaftersave && ( m.onaftersave = function () {
return m.catchError( e( c.onaftersave )( a ) )
} ), a.$parent.$watch( c[ m.directiveName ], function () {
m.handleEmpty()
} )
}, m.render = function () {
var a = m.theme;
m.inputEl = angular.element( m.inputTpl ), m.controlsEl = angular.element( a.controlsTpl ), m.controlsEl.append( m.inputEl ), "no" !== m.buttons && ( m.buttonsEl = angular.element( a.buttonsTpl ), m.submitEl = angular.element( a.submitTpl ), m.cancelEl = angular.element( a.cancelTpl ), m.buttonsEl.append( m.submitEl )
.append( m.cancelEl ), m.controlsEl.append( m.buttonsEl ), m.inputEl.addClass( "editable-has-buttons" ) ), m.errorEl = angular.element( a.errorTpl ), m.controlsEl.append( m.errorEl ), m.editorEl = angular.element( m.single ? a.formTpl : a.noformTpl ), m.editorEl.append( m.controlsEl );
for ( var d in c.$attr )
if ( !( d.length <= 1 ) ) {
var e = !1,
f = d.substring( 1, 2 );
if ( "e" === d.substring( 0, 1 ) && f === f.toUpperCase() && ( e = d.substring( 1 ), "Form" !== e && "NgSubmit" !== e ) ) {
e = e.substring( 0, 1 )
.toLowerCase() + b.camelToDash( e.substring( 1 ) );
var h = "" === c[ d ] ? e : c[ d ];
m.inputEl.attr( e, h )
}
}
m.inputEl.addClass( "editable-input" ), m.inputEl.attr( "ng-model", "$data" ), m.editorEl.addClass( b.camelToDash( m.directiveName ) ), m.single && ( m.editorEl.attr( "editable-form", "$form" ), m.editorEl.attr( "blur", m.attrs.blur || ( "no" === m.buttons ? "cancel" : g.blurElem ) ) ), angular.isFunction( a.postrender ) && a.postrender.call( m )
}, m.setLocalValue = function () {
m.scope.$data = m.useCopy ? angular.copy( k( a.$parent ) ) : k( a.$parent )
}, m.show = function () {
return m.setLocalValue(), m.render(), d.after( m.editorEl ), i( m.editorEl )( a ), m.addListeners(), d.addClass( "editable-hide" ), m.onshow()
}, m.hide = function () {
return m.editorEl.remove(), d.removeClass( "editable-hide" ), m.onhide()
}, m.cancel = function () {
m.oncancel()
}, m.addListeners = function () {
m.inputEl.bind( "keyup", function ( a ) {
if ( m.single ) switch ( a.keyCode ) {
case 27:
m.scope.$apply( function () {
m.scope.$form.$cancel()
} )
}
} ), m.single && "no" === m.buttons && m.autosubmit(), m.editorEl.bind( "click", function ( a ) {
1 === a.which && m.scope.$form.$visible && ( m.scope.$form._clicked = !0 )
} )
}, m.setWaiting = function ( a ) {
a ? ( l = !m.inputEl.attr( "disabled" ) && !m.inputEl.attr( "ng-disabled" ) && !m.inputEl.attr( "ng-enabled" ), l && ( m.inputEl.attr( "disabled", "disabled" ), m.buttonsEl && m.buttonsEl.find( "button" )
.attr( "disabled", "disabled" ) ) ) : l && ( m.inputEl.removeAttr( "disabled" ), m.buttonsEl && m.buttonsEl.find( "button" )
.removeAttr( "disabled" ) )
}, m.activate = function () {
setTimeout( function () {
var a = m.inputEl[ 0 ];
"focus" === g.activate && a.focus && a.focus(), "select" === g.activate && a.select && a.select()
}, 0 )
}, m.setError = function ( b ) {
angular.isObject( b ) || ( a.$error = b, m.error = b )
}, m.catchError = function ( a, b ) {
return angular.isObject( a ) && b !== !0 ? j.when( a )
.then( angular.bind( this, function ( a ) {
this.catchError( a, !0 )
} ), angular.bind( this, function ( a ) {
this.catchError( a, !0 )
} ) ) : b && angular.isObject( a ) && a.status && 200 !== a.status && a.data && angular.isString( a.data ) ? ( this.setError( a.data ), a = a.data ) : angular.isString( a ) && this.setError( a ), a
}, m.save = function () {
k.assign( a.$parent, angular.copy( m.scope.$data ) )
}, m.handleEmpty = function () {
var b = k( a.$parent ),
c = null === b || void 0 === b || "" === b || angular.isArray( b ) && 0 === b.length;
d.toggleClass( "editable-empty", c )
}, m.autosubmit = angular.noop, m.onshow = angular.noop, m.onhide = angular.noop, m.oncancel = angular.noop, m.onbeforesave = angular.noop, m.onaftersave = angular.noop
}
return c.$inject = [ "$scope", "$attrs", "$element", "$parse", "editableThemes", "editableOptions", "$rootScope", "$compile", "$q" ], c
} ] ), angular.module( "xeditable" )
.factory( "editableDirectiveFactory", [ "$parse", "$compile", "editableThemes", "$rootScope", "$document", "editableController", "editableFormController", function ( a, b, c, d, e, f, g ) {
return function ( b ) {
return {
restrict: "A",
scope: !0,
require: [ b.directiveName, "?^form" ],
controller: f,
link: function ( c, f, h, i ) {
var j, k = i[ 0 ],
l = !1;
if ( i[ 1 ] ) j = i[ 1 ], l = !0;
else if ( h.eForm ) {
var m = a( h.eForm )( c );
if ( m ) j = m, l = !0;
else
for ( var n = 0; n < e[ 0 ].forms.length; n++ )
if ( e[ 0 ].forms[ n ].name === h.eForm ) {
j = null, l = !0;
break
}
}
if ( angular.forEach( b, function ( a, b ) {
void 0 !== k[ b ] && ( k.parent[ b ] = k[ b ] )
} ), angular.extend( k, b ), k.init( !l ), c.$editable = k, f.addClass( "editable" ), l )
if ( j ) {
if ( c.$form = j, !c.$form.$addEditable ) throw "Form with editable elements should have `editable-form` attribute.";
c.$form.$addEditable( k )
} else d.$$editableBuffer = d.$$editableBuffer || {}, d.$$editableBuffer[ h.eForm ] = d.$$editableBuffer[ h.eForm ] || [], d.$$editableBuffer[ h.eForm ].push( k ), c.$form = null;
else c.$form = g(), c.$form.$addEditable( k ), h.eForm && ( c.$parent[ h.eForm ] = c.$form ), h.eForm || ( f.addClass( "editable-click" ), f.bind( "click", function ( a ) {
a.preventDefault(), a.editable = k, c.$apply( function () {
c.$form.$show()
} )
} ) )
}
}
}
} ] ), angular.module( "xeditable" )
.factory( "editableFormController", [ "$parse", "$document", "$rootScope", "editablePromiseCollection", "editableUtils", function ( a, b, c, d, e ) {
var f = [];
b.bind( "click", function ( a ) {
if ( 1 === a.which ) {
for ( var b = [], d = [], e = 0; e < f.length; e++ ) f[ e ]._clicked ? f[ e ]._clicked = !1 : f[ e ].$waiting || ( "cancel" === f[ e ]._blur && b.push( f[ e ] ), "submit" === f[ e ]._blur && d.push( f[ e ] ) );
( b.length || d.length ) && c.$apply( function () {
angular.forEach( b, function ( a ) {
a.$cancel()
} ), angular.forEach( d, function ( a ) {
a.$submit()
} )
} )
}
} );
var g = {
$addEditable: function ( a ) {
this.$editables.push( a ), a.elem.bind( "$destroy", angular.bind( this, this.$removeEditable, a ) ), a.scope.$form || ( a.scope.$form = this ), this.$visible && a.catchError( a.show() )
},
$removeEditable: function ( a ) {
for ( var b = 0; b < this.$editables.length; b++ )
if ( this.$editables[ b ] === a ) return this.$editables.splice( b, 1 ), void 0
},
$show: function () {
if ( !this.$visible ) {
this.$visible = !0;
var a = d();
a.when( this.$onshow() ), this.$setError( null, "" ), angular.forEach( this.$editables, function ( b ) {
a.when( b.show() )
} ), a.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 === e.indexOf( f, this ) && f.push( this )
} ), 0 )
}
},
$activate: function ( a ) {
var b;
if ( this.$editables.length ) {
if ( angular.isString( a ) )
for ( b = 0; b < this.$editables.length; b++ )
if ( this.$editables[ b ].name === a ) return this.$editables[ b ].activate(), void 0;
for ( b = 0; b < this.$editables.length; b++ )
if ( this.$editables[ b ].error ) return this.$editables[ b ].activate(), void 0;
this.$editables[ 0 ].activate()
}
},
$hide: function () {
this.$visible && ( this.$visible = !1, this.$onhide(), angular.forEach( this.$editables, function ( a ) {
a.hide()
} ), e.arrayRemove( f, this ) )
},
$cancel: function () {
this.$visible && ( this.$oncancel(), angular.forEach( this.$editables, function ( a ) {
a.cancel()
} ), this.$hide() )
},
$setWaiting: function ( a ) {
this.$waiting = !!a, angular.forEach( this.$editables, function ( b ) {
b.setWaiting( !!a )
} )
},
$setError: function ( a, b ) {
angular.forEach( this.$editables, function ( c ) {
a && c.name !== a || c.setError( b )
} )
},
$submit: function () {
function a( a ) {
var b = d();
b.when( this.$onbeforesave() ), b.then( {
onWait: angular.bind( this, this.$setWaiting ),
onTrue: a ? angular.bind( this, this.$save ) : angular.bind( this, this.$hide ),
onFalse: angular.bind( this, this.$hide ),
onString: angular.bind( this, this.$activate )
} )
}
if ( !this.$waiting ) {
this.$setError( null, "" );
var b = d();
angular.forEach( this.$editables, function ( a ) {
b.when( a.onbeforesave() )
} ), b.then( {
onWait: angular.bind( this, this.$setWaiting ),
onTrue: angular.bind( this, a, !0 ),
onFalse: angular.bind( this, a, !1 ),
onString: angular.bind( this, this.$activate )
} )
}
},
$save: function () {
angular.forEach( this.$editables, function ( a ) {
a.save()
} );
var a = d();
a.when( this.$onaftersave() ), angular.forEach( this.$editables, function ( b ) {
a.when( b.onaftersave() )
} ), a.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
}, g )
}
} ] ), angular.module( "xeditable" )
.directive( "editableForm", [ "$rootScope", "$parse", "editableFormController", "editableOptions", function ( a, b, c, d ) {
return {
restrict: "A",
require: [ "form" ],
compile: function () {
return {
pre: function ( b, d, e, f ) {
var g, h = f[ 0 ];
e.editableForm ? b[ e.editableForm ] && b[ e.editableForm ].$show ? ( g = b[ e.editableForm ], angular.extend( h, g ) ) : ( g = c(), b[ e.editableForm ] = g, angular.extend( g, h ) ) : ( g = c(), angular.extend( h, g ) );
var i = a.$$editableBuffer,
j = h.$name;
j && i && i[ j ] && ( angular.forEach( i[ j ], function ( a ) {
g.$addEditable( a )
} ), delete i[ j ] )
},
post: function ( a, c, e, f ) {
var g;
g = e.editableForm && a[ e.editableForm ] && a[ e.editableForm ].$show ? a[ e.editableForm ] : f[ 0 ], e.onshow && ( g.$onshow = angular.bind( g, b( e.onshow ), a ) ), e.onhide && ( g.$onhide = angular.bind( g, b( e.onhide ), a ) ), e.oncancel && ( g.$oncancel = angular.bind( g, b( e.oncancel ), a ) ), e.shown && b( e.shown )( a ) && g.$show(), g._blur = e.blur || d.blurForm, e.ngSubmit || e.submit || ( e.onbeforesave && ( g.$onbeforesave = function () {
return b( e.onbeforesave )( a, {
$data: g.$data
} )
} ), e.onaftersave && ( g.$onaftersave = function () {
return b( e.onaftersave )( a, {
$data: g.$data
} )
} ), c.bind( "submit", function ( b ) {
b.preventDefault(), a.$apply( function () {
g.$submit()
} )
} ) ), c.bind( "click", function ( a ) {
1 === a.which && g.$visible && ( g._clicked = !0 )
} )
}
}
}
}
} ] ), angular.module( "xeditable" )
.factory( "editablePromiseCollection", [ "$q", function ( a ) {
function b() {
return {
promises: [],
hasFalse: !1,
hasString: !1,
when: function ( b, c ) {
if ( b === !1 ) this.hasFalse = !0;
else if ( !c && angular.isObject( b ) ) this.promises.push( a.when( b ) );
else {
if ( !angular.isString( b ) ) return;
this.hasString = !0
}
},
then: function ( b ) {
function c() {
h.hasString || h.hasFalse ? !h.hasString && h.hasFalse ? e() : f() : d()
}
b = b || {};
var d = b.onTrue || angular.noop,
e = b.onFalse || angular.noop,
f = b.onString || angular.noop,
g = b.onWait || angular.noop,
h = this;
this.promises.length ? ( g( !0 ), a.all( this.promises )
.then( function ( a ) {
g( !1 ), angular.forEach( a, function ( a ) {
h.when( a, !0 )
} ), c()
}, function () {
g( !1 ), f()
} ) ) : c()
}
}
}
return b
} ] ), angular.module( "xeditable" )
.factory( "editableUtils", [ function () {
return {
indexOf: function ( a, b ) {
if ( a.indexOf ) return a.indexOf( b );
for ( var c = 0; c < a.length; c++ )
if ( b === a[ c ] ) return c;
return -1
},
arrayRemove: function ( a, b ) {
var c = this.indexOf( a, b );
return c >= 0 && a.splice( c, 1 ), b
},
camelToDash: function ( a ) {
var b = /[A-Z]/g;
return a.replace( b, function ( a, b ) {
return ( b ? "-" : "" ) + a.toLowerCase()
} )
},
dashToCamel: function ( a ) {
var b = /([\:\-\_]+(.))/g,
c = /^moz([A-Z])/;
return a.replace( b, function ( a, b, c, d ) {
return d ? c.toUpperCase() : c
} )
.replace( c, "Moz$1" )
}
}
} ] ), angular.module( "xeditable" )
.factory( "editableNgOptionsParser", [ function () {
function a( a ) {
var c;
if ( !( c = a.match( b ) ) ) throw "ng-options parse error";
var d, e = c[ 2 ] || c[ 1 ],
f = c[ 4 ] || c[ 6 ],
g = c[ 5 ],
h = ( c[ 3 ] || "", c[ 2 ] ? c[ 1 ] : f ),
i = c[ 7 ],
j = c[ 8 ],
k = j ? c[ 8 ] : null;
return void 0 === g ? ( d = f + " in " + i, void 0 !== j && ( d += " track by " + k ) ) : d = "(" + g + ", " + f + ") in " + i, {
ngRepeat: d,
locals: {
valueName: f,
keyName: g,
valueFn: h,
displayFn: e
}
}
}
var b = /^\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 a
} ] ), angular.module( "xeditable" )
.factory( "editableThemes", function () {
var a = {
"default": {
formTpl: '',
noformTpl: '',
controlsTpl: '',
inputTpl: "",
errorTpl: '',
buttonsTpl: '',
submitTpl: '',
cancelTpl: ''
},
bs2: {
formTpl: '',
noformTpl: '',
controlsTpl: '',
inputTpl: "",
errorTpl: '',
buttonsTpl: '',
submitTpl: '',
cancelTpl: ''
},
bs3: {
formTpl: '',
noformTpl: '',
controlsTpl: '',
inputTpl: "",
errorTpl: '',
buttonsTpl: '',
submitTpl: '',
cancelTpl: '',
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 "editableTime":
case "editableMonth":
case "editableWeek":
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 )
}
}
this.buttonsEl && this.theme.buttonsClass && this.buttonsEl.find( "button" )
.addClass( this.theme.buttonsClass )
}
}
};
return a
} );