AC-171 first round of changes to make select dialogs more understandable. Also changed tooltip config to include a default time for hide and a default time for show.

This commit is contained in:
chouseknecht 2013-07-09 00:09:37 -04:00
parent 259083c0e2
commit a82edf0e4a
18 changed files with 161 additions and 121 deletions

View File

@ -26,6 +26,7 @@
/* Attempt to make button heights consistent. For some reason success, info, etc. are
taller than plain .btn */
.btn-success, .btn-danger, .btn-info, .btn-primary {
padding-top: 1px;
padding-bottom: 1px;
@ -37,6 +38,11 @@
min-width: 28px;
}
.btn-pad {
padding-top: 3px;
padding-bottom: 1px;
}
.modal-footer .btn-success,
.modal-footer .btn-danger,
.modal-footer .btn-info,
@ -318,7 +324,11 @@
display: inline-block;
vertical-align: top;
margin-left: 10px;
margin-top: 3px;
padding-bottom: 22px;
}
.list-actions .btn {
margin-right: 10px;
}
.status-actions {

View File

@ -4,7 +4,7 @@
*
* awx-min.js
*
* master-4ad18dd, Mon Jul 8 14:48:03 2013 -0400
* master-18c53bb, Mon Jul 8 15:33:44 2013 -0400
*
*/
var urlPrefix="/static/";
@ -20,7 +20,7 @@ controller:CredentialsEdit}).when("/credentials",{templateUrl:urlPrefix+"partial
{templateUrl:urlPrefix+"partials/users.html",controller:CredentialsList}).when("/users/:user_id/permissions/add",{templateUrl:urlPrefix+"partials/users.html",controller:PermissionsAdd}).when("/users/:user_id/permissions",{templateUrl:urlPrefix+"partials/users.html",controller:PermissionsList}).when("/users/:user_id/permissions/:permission_id",{templateUrl:urlPrefix+"partials/users.html",controller:PermissionsEdit}).when("/users/:user_id/credentials/add",{templateUrl:urlPrefix+"partials/teams.html",
controller:CredentialsAdd}).when("/teams/:user_id/credentials/:credential_id",{templateUrl:urlPrefix+"partials/teams.html",controller:CredentialsEdit}).when("/login",{templateUrl:urlPrefix+"partials/login-dialog.html",controller:Authenticate}).when("/logout",{templateUrl:urlPrefix+"partials/login-dialog.html",controller:Authenticate}).otherwise({redirectTo:"/"})}]).run(["$rootScope","CheckLicense","$location","Authorization","LoadBasePaths",function(h,m,k,g,c){c();h.breadcrumbs=[];h.crumbCache=[];
h.$on("$routeChangeStart",function(c,f,e){!1==g.isTokenValid()?f.templateUrl!=urlPrefix+"partials/login.html"&&k.path("/login"):((void 0==h.current_user||null==h.current_user)&&g.restoreUserInfo(),m());c=k.path().replace(/^\//,"").split("/")[0];""==c?$('.nav-tabs a[href="#organizations"]').tab("show"):(c.replace(/\_/g," "),$('.nav-tabs a[href="#'+c+'"]').tab("show"))});g.isTokenValid()||k.path("/login");c=k.path().replace(/^\//,"").split("/")[0];""==c?(c="organizations",k.path("/organizations")):
c.replace(/\_/g," ");$('.nav-tabs a[href="#'+c+'"]').tab("show");h.viewCurrentUser=function(){k.path("/users/"+h.current_user.id)}}]);var $AnsibleConfig={session_timeout:3600,tooltip_delay:2E3,debug_mode:!0};function AdminsList(h,m,k,g,c,p,f,e,l,a,d,b,z,w,B){h=B("organizations")+c.organization_id+"/users/";var u=l.inject(e,{mode:"select"});u.selected=[];u.PostRefreshRemove&&u.PostRefreshRemove();u.PostRefreshRemove=u.$on("PostRefresh",function(){$("tr.success").each(function(a){a=$(this).attr("ng-class");u[a]=""})});b({scope:u,set:"admins",list:e,url:h});z({scope:u,list:e,url:h});u.search(e.iterator);a();u.finishSelection=function(){var a=B("organizations")+c.organization_id+"/admins/";p.setUrl(a);u.queue=
c.replace(/\_/g," ");$('.nav-tabs a[href="#'+c+'"]').tab("show");h.viewCurrentUser=function(){k.path("/users/"+h.current_user.id)}}]);var $AnsibleConfig={session_timeout:3600,tooltip_delay:{show:500,hide:100},debug_mode:!0};function AdminsList(h,m,k,g,c,p,f,e,l,a,d,b,z,w,B){h=B("organizations")+c.organization_id+"/users/";var u=l.inject(e,{mode:"select"});u.selected=[];u.PostRefreshRemove&&u.PostRefreshRemove();u.PostRefreshRemove=u.$on("PostRefresh",function(){$("tr.success").each(function(a){a=$(this).attr("ng-class");u[a]=""})});b({scope:u,set:"admins",list:e,url:h});z({scope:u,list:e,url:h});u.search(e.iterator);a();u.finishSelection=function(){var a=B("organizations")+c.organization_id+"/admins/";p.setUrl(a);u.queue=
[];u.$on("callFinished",function(){if(u.queue.length==u.selected.length){$('input[type="checkbox"]').prop("checked",!1);u.selected=[];for(var a=0,b=0;b<u.queue.length;b++)"error"==u.queue[b].result&&a++;0<a?f("Error","There was an error while adding one or more of the selected users."):w(1)}});if(0<u.selected.length)for(var b=0;b<u.selected.length;b++){for(var a=null,d=0;d<u.admins.length;d++)u.admins[d].id==u.selected[b]&&(a=u.admins[d]);null!==a&&p.post(a).success(function(a,b,d,c){u.queue.push({result:"success",
data:a,status:b});u.$emit("callFinished")}).error(function(a,b,d,c){u.queue.push({result:"error",data:a,status:b,headers:d});u.$emit("callFinished")})}else w(1)};u.toggle_admin=function(a){"success"==u[e.iterator+"_"+a+"_class"]?(u[e.iterator+"_"+a+"_class"]="",document.getElementById("check_"+a).checked=!1,-1<u.selected.indexOf(a)&&u.selected.splice(u.selected.indexOf(a),1)):(u[e.iterator+"_"+a+"_class"]="success",document.getElementById("check_"+a).checked=!0,-1==u.selected.indexOf(a)&&u.selected.push(a))}}
AdminsList.$inject="$scope $rootScope $location $log $routeParams Rest Alert AdminList GenerateList LoadBreadCrumbs Prompt SearchInit PaginateInit ReturnToCaller GetBasePath".split(" ");function Authenticate(h,m,k,g,c,p){"/logout"==k.path()&&g.logout();m.userLoggedIn=!1;h.sessionExpired=g.didSessionExpire();h.sessionTimeout=($AnsibleConfig.session_timeout/60).toFixed(2);$("#login-password").bind("keypress",function(c){13==(c.keyCode?c.keyCode:c.which)&&$("#login-button").click()});$("#login-modal").modal({show:!0,keyboard:!1,backdrop:!1});h.reset=function(){$("#login-form input").each(function(c){$(this).val("")})};h.systemLogin=function(c,e){$(".api-error").empty();g.retrieveToken(c,
@ -44,15 +44,15 @@ s.selected.splice(s.selected.indexOf(a),1)):(s[e.iterator+"_"+a+"_class"]="succe
function InventoriesAdd(h,m,k,g,c,p,f,e,l,a,d,b,z,w,B,u,x,t,s,n,C){w("htmlTemplate");var q=n("inventory"),v=e.inject(f,{mode:"add",related:!1});v.parseType="yaml";e.reset();b();C(v);s({scope:v,form:f,current_item:p.organization_id?p.organization_id:null,list:u,field:"organization"});v.formSave=function(){try{if("json"==v.parseType){JSON.parse(v.variables);var b=v.variables}else b=jsyaml.load(v.variables);var c={},e;for(e in f.fields)"variables"!=e&&(f.fields[e].realName?c[f.fields[e].realName]=v[e]:
c[e]=v[e]);l.setUrl(q);l.post(c).success(function(a,c,e,n){var k=a.id;v.variables?(l.setUrl(a.related.variable_data),l.put(b).success(function(a,b,d,c){g.path("/inventories/"+k)}).error(function(a,b,c,e){d(v,a,b,f,{hdr:"Error!",msg:"Failed to add inventory varaibles. PUT returned status: "+b})})):g.path("/inventories/"+k)}).error(function(a,b,c,e){d(v,a,b,f,{hdr:"Error!",msg:"Failed to add new inventory. Post returned status: "+b})})}catch(n){a("Error","Error parsing inventory variables. Parser returned: "+
n)}};v.formReset=function(){e.reset()}}InventoriesAdd.$inject="$scope $rootScope $compile $location $log $routeParams InventoryForm GenerateForm Rest Alert ProcessErrors LoadBreadCrumbs ReturnToCaller ClearScope GenerateList OrganizationList SearchInit PaginateInit LookUpInit GetBasePath ParseTypeChange".split(" ");
function InventoriesEdit(h,m,k,g,c,p,f,e,l,a,d,b,z,w,B,u,x,t,s,n,C,q,v,A,E,F,D,r,K,G,I){u("htmlTemplate");var H=C("inventory"),y=e.inject(f,{mode:"edit",related:!0});e.reset();var L=g.path().replace(/^\//,"").split("/")[0],J=p.id;I(y);y.parseType="yaml";y.inventory_id=J;y.inventoryLoadedRemove&&y.inventoryLoadedRemove();y.inventoryLoadedRemove=y.$on("inventoryLoaded",function(){y.groupTitle="All Hosts";y.createButtonShow=!1;y.search(y.relatedSets.hosts.iterator);n(y.TreeParams);x({scope:y,form:f,
function InventoriesEdit(h,m,k,g,c,p,f,e,l,a,d,b,z,w,B,u,x,t,s,n,C,q,v,A,E,F,D,r,K,G,J){u("htmlTemplate");var H=C("inventory"),y=e.inject(f,{mode:"edit",related:!0});e.reset();var L=g.path().replace(/^\//,"").split("/")[0],I=p.id;J(y);y.parseType="yaml";y.inventory_id=I;y.inventoryLoadedRemove&&y.inventoryLoadedRemove();y.inventoryLoadedRemove=y.$on("inventoryLoaded",function(){y.groupTitle="All Hosts";y.createButtonShow=!1;y.search(y.relatedSets.hosts.iterator);n(y.TreeParams);x({scope:y,form:f,
current_item:y.organization?y.organization:null,list:s,field:"organization"});y.variable_url?(l.setUrl(y.variable_url),l.get().success(function(a,b,d,c){$.isEmptyObject(a)?y.variables="---":y.variables=jsyaml.safeDump(a)}).error(function(a,b,c,e){y.variables=null;d(y,a,b,f,{hdr:"Error!",msg:"Failed to retrieve inventory variables. GET returned status: "+b})})):y.variables="---"});A({scope:y});y.filterInventory=function(){G({scope:y})};y.formSave=function(){try{if("json"==y.parseType){JSON.parse(y.variables);
var b=y.variables}else b=jsyaml.load(y.variables);var c={},e;for(e in f.fields)"variables"!=e&&(f.fields[e].realName?c[f.fields[e].realName]=y[e]:c[e]=y[e]);l.setUrl(H+J+"/");l.put(c).success(function(a,c,e,n){y.variables?(l.setUrl(a.related.variable_data),l.put(b).success(function(a,b,d,c){g.path("/inventories")}).error(function(a,b,c,e){d(y,a,b,f,{hdr:"Error!",msg:"Failed to update inventory varaibles. PUT returned status: "+b})})):g.path("/inventories")}).error(function(a,b,c,e){d(y,a,b,f,{hdr:"Error!",
var b=y.variables}else b=jsyaml.load(y.variables);var c={},e;for(e in f.fields)"variables"!=e&&(f.fields[e].realName?c[f.fields[e].realName]=y[e]:c[e]=y[e]);l.setUrl(H+I+"/");l.put(c).success(function(a,c,e,n){y.variables?(l.setUrl(a.related.variable_data),l.put(b).success(function(a,b,d,c){g.path("/inventories")}).error(function(a,b,c,e){d(y,a,b,f,{hdr:"Error!",msg:"Failed to update inventory varaibles. PUT returned status: "+b})})):g.path("/inventories")}).error(function(a,b,c,e){d(y,a,b,f,{hdr:"Error!",
msg:"Failed to update new inventory. Post returned status: "+b})})}catch(n){a("Error","Error parsing inventory variables. Parser returned: "+n)}};y.formReset=function(){e.reset();for(var a in y.master)y[a]=y.master[a]};y.add=function(a){m.flashMessage=null;g.path("/"+L+"/"+p.id+"/groups/"+y.group_id+"/"+a+"/add")};y.edit=function(a,b,d){m.flashMessage=null;g.path("/"+L+"/"+p.id+"/"+a+"/"+b)};y["delete"]=function(a,b,c,e){m.flashMessage=null;t({hdr:"Delete",body:"Are you sure you want to remove "+
c+" from "+y.name+" "+e+"?",action:function(){var c=H+J+"/"+a+"/";l.setUrl(c);l.post({id:b,disassociate:1}).success(function(b,d,c,e){$("#prompt-modal").modal("hide");y.search(f.related[a].iterator)}).error(function(a,b,f,e){$("#prompt-modal").modal("hide");d(y,a,b,null,{hdr:"Error!",msg:"Call to "+c+" failed. POST returned status: "+b})})}})};y.treeController=function(a){return"inventory"==$(a).attr("type")?{addGroup:{label:"Add Group",action:function(a){q({inventory_id:J,group_id:null})}}}:{addGroup:{label:"Add Group",
action:function(a){q({inventory_id:J,group_id:$(a).attr("group_id")})}},edit:{label:"Edit Group",action:function(a){v({inventory_id:J,group_id:$(a).attr("group_id")})},separator_before:!0},"delete":{label:"Delete Group",action:function(a){E({scope:y,inventory_id:J,group_id:$(a).attr("group_id")})}}}};y.$on("NodeSelect",function(a,b){var d=$('li[id="'+b.attr.id+'"]'),c=d.attr("type"),e;y.selectedNode=d;$("#tree-view").jstree("open_node",d);"group"==c?(e=d.attr("all"),y.groupAddHide=!1,y.groupEditHide=
c+" from "+y.name+" "+e+"?",action:function(){var c=H+I+"/"+a+"/";l.setUrl(c);l.post({id:b,disassociate:1}).success(function(b,d,c,e){$("#prompt-modal").modal("hide");y.search(f.related[a].iterator)}).error(function(a,b,f,e){$("#prompt-modal").modal("hide");d(y,a,b,null,{hdr:"Error!",msg:"Call to "+c+" failed. POST returned status: "+b})})}})};y.treeController=function(a){return"inventory"==$(a).attr("type")?{addGroup:{label:"Add Group",action:function(a){q({inventory_id:I,group_id:null})}}}:{addGroup:{label:"Add Group",
action:function(a){q({inventory_id:I,group_id:$(a).attr("group_id")})}},edit:{label:"Edit Group",action:function(a){v({inventory_id:I,group_id:$(a).attr("group_id")})},separator_before:!0},"delete":{label:"Delete Group",action:function(a){E({scope:y,inventory_id:I,group_id:$(a).attr("group_id")})}}}};y.$on("NodeSelect",function(a,b){var d=$('li[id="'+b.attr.id+'"]'),c=d.attr("type"),e;y.selectedNode=d;$("#tree-view").jstree("open_node",d);"group"==c?(e=d.attr("all"),y.groupAddHide=!1,y.groupEditHide=
!1,y.groupDeleteHide=!1,y.createButtonShow=!0,y.group_id=d.attr("group_id"),y.groupName=b.data,y.groupTitle=b.data,y.groupTitle+=d.attr("description")?" -"+d.attr("description"):""):"inventory"==c&&(e=d.attr("hosts"),y.groupAddHide=!1,y.groupEditHide=!0,y.groupDeleteHide=!0,y.createButtonShow=!1,y.groupName="All Hosts",y.groupTitle="All Hosts",y.group_id=null);y.relatedSets.hosts={url:e,iterator:"host"};z({scope:y,form:f,relatedSets:y.relatedSets});w({scope:y,relatedSets:y.relatedSets});y.search("host");
y.$$phase||y.$digest()});y.addGroup=function(){q({inventory_id:J,group_id:y.group_id})};y.editGroup=function(){v({inventory_id:J,group_id:y.group_id})};y.deleteGroup=function(){E({scope:y,inventory_id:J,group_id:y.group_id})};y.addHost=function(){F({scope:y,inventory_id:J,group_id:y.group_id})};y.editHost=function(a,b){r({scope:y,inventory_id:J,group_id:y.group_id,host_id:a,host_name:b})};y.deleteHost=function(a,b){K({scope:y,inventory_id:J,group_id:y.group_id,host_id:a,host_name:b})};y.showEvents=
function(a,c){l.setUrl(c);l.get().success(function(d,c,f,e){b({path:"/jobs/"+d.id,title:d.name});g.url("/jobs/"+d.id+"/job_events/?host="+escape(a))}).error(function(a,b,e,l){d(y,a,b,f,{hdr:"Error!",msg:"Failed to lookup last job: "+c+". GET status: "+b})})}}InventoriesEdit.$inject="$scope $rootScope $compile $location $log $routeParams InventoryForm GenerateForm Rest Alert ProcessErrors LoadBreadCrumbs RelatedSearchInit RelatedPaginateInit ReturnToCaller ClearScope LookUpInit Prompt OrganizationList TreeInit GetBasePath GroupsList GroupsEdit LoadInventory GroupsDelete HostsList HostsAdd HostsEdit HostsDelete RefreshTree ParseTypeChange".split(" ");function JobEventsList(h,m,k,g,c,p,f,e,l,a,d,b,z,w,B,u,x,t,s,n,C){B("htmlTemplate");e.base=k.path();h=x("jobs")+c.id+"/job_events/";k.path().replace(/^\//,"").split("/");var q=l.inject(e,{mode:"edit"});m.flashMessage=null;q.selected=[];q.expand=!0;q.parentNode="parent-event";q.childNode="child-event";q.RemovePostRefresh&&q.RemovePostRefresh();q.RemovePostRefresh=q.$on("PostRefresh",function(){for(var a=q[e.name],b,d=0;d<a.length;d++){a[d].event_display=a[d].event_display.replace(/^\u00a0*/g,"");if(3>
y.$$phase||y.$digest()});y.addGroup=function(){q({inventory_id:I,group_id:y.group_id})};y.editGroup=function(){v({inventory_id:I,group_id:y.group_id})};y.deleteGroup=function(){E({scope:y,inventory_id:I,group_id:y.group_id})};y.selectHost=function(){F({scope:y,inventory_id:I,group_id:y.group_id})};y.createHost=function(){D({scope:y,inventory_id:I,group_id:y.group_id})};y.editHost=function(a,b){r({scope:y,inventory_id:I,group_id:y.group_id,host_id:a,host_name:b})};y.deleteHost=function(a,b){K({scope:y,
inventory_id:I,group_id:y.group_id,host_id:a,host_name:b})};y.showEvents=function(a,c){l.setUrl(c);l.get().success(function(d,c,f,e){b({path:"/jobs/"+d.id,title:d.name});g.url("/jobs/"+d.id+"/job_events/?host="+escape(a))}).error(function(a,b,e,l){d(y,a,b,f,{hdr:"Error!",msg:"Failed to lookup last job: "+c+". GET status: "+b})})}}InventoriesEdit.$inject="$scope $rootScope $compile $location $log $routeParams InventoryForm GenerateForm Rest Alert ProcessErrors LoadBreadCrumbs RelatedSearchInit RelatedPaginateInit ReturnToCaller ClearScope LookUpInit Prompt OrganizationList TreeInit GetBasePath GroupsList GroupsEdit LoadInventory GroupsDelete HostsList HostsAdd HostsEdit HostsDelete RefreshTree ParseTypeChange".split(" ");function JobEventsList(h,m,k,g,c,p,f,e,l,a,d,b,z,w,B,u,x,t,s,n,C){B("htmlTemplate");e.base=k.path();h=x("jobs")+c.id+"/job_events/";k.path().replace(/^\//,"").split("/");var q=l.inject(e,{mode:"edit"});m.flashMessage=null;q.selected=[];q.expand=!0;q.parentNode="parent-event";q.childNode="child-event";q.RemovePostRefresh&&q.RemovePostRefresh();q.RemovePostRefresh=q.$on("PostRefresh",function(){for(var a=q[e.name],b,d=0;d<a.length;d++){a[d].event_display=a[d].event_display.replace(/^\u00a0*/g,"");if(3>
a[d].event_level)a[d].ngclick="toggleChildren("+a[d].id+', "'+a[d].related.children+'")',a[d].ngicon="icon-collapse-alt",a[d]["class"]="parentNode";else{a[d]["class"]="childNode";b=a[d];var c=a[d].event_data,f="";if(c.res){var l=!1,n=void 0,n=void 0;if("string"==typeof c.res)n=(n=c.res.match(/\n/g))?n.length:1,l=!0,f+="<label>Traceback:</label>\n",f+='<textarea readonly class="input-xxlarge" rows="'+n+'">'+c.res+"</textarea>\n";else{var k=void 0;for(k in c.res)if(("msg"==k||"stdout"==k||"stderr"==
k)&&null!==c.res[k]&&""!==c.res[k]){f+="<label>";switch(k){case "msg":case "stdout":f+="Output:";break;case "stderr":f+="Error:"}f+="</label>\n";n=(n=c.res[k].match(/\n/g))?n.length:1;f+='<textarea readonly class="input-xxlarge" rows="'+n+'">'+c.res[k]+"</textarea>\n";l=!0}}f=l?'<form class="event-detail">\n'+f+"</form>\n":""}f=""==f?null:f;b.event_detail=f}a[d].show=!0;a[d].spaces=24*a[d].event_level;q.jobevents[d].status=q.jobevents[d].failed?"error":q.jobevents[d].changed?"changed":"success";b=
new Date(a[d].created);a[d].created=C(b)}});b({scope:q,set:"jobevents",list:e,url:h});z({scope:q,list:e,url:h});c.host&&(q[e.iterator+"SearchField"]="host",q[e.iterator+"SearchValue"]=c.host,q[e.iterator+"SearchFieldLabel"]=e.fields.host.label);q.search(e.iterator);q.toggleChildren=function(a,b){s({scope:q,list:e,id:a,children:b})};a();q.viewJobEvent=function(a){n({event_id:a})};q.refresh=function(){q.expand=!0;q.search(e.iterator)};q.jobDetails=function(){k.path("/jobs/"+c.id)};q.jobSummary=function(){k.path("/jobs/"+
@ -66,15 +66,15 @@ list:e,url:C});c.inventory__int&&(q[e.iterator+"SearchField"]="inventory",q[e.it
{hdr:"Error!",msg:"Call to "+n+" failed. POST returned status: "+b})}):p.destroy().success(function(a,b,d,c){$("#prompt-modal").modal("hide");q.search(e.iterator)}).error(function(a,b,d,c){$("#prompt-modal").modal("hide");u(q,a,b,null,{hdr:"Error!",msg:"Call to "+n+" failed. DELETE returned status: "+b})})}})}).error(function(a,b,d,c){u(q,a,b,null,{hdr:"Error!",msg:"Failed to get job details. GET returned status: "+b})})};q.submitJob=function(a,b){s({scope:q,id:a,template:b})}}
JobsListCtrl.$inject="$scope $rootScope $location $log $routeParams Rest Alert JobList GenerateList LoadBreadCrumbs Prompt SearchInit PaginateInit ReturnToCaller ClearScope ProcessErrors GetBasePath LookUpInit SubmitJob FormatDate".split(" ");
function JobsEdit(h,m,k,g,c,p,f,e,l,a,d,b,z,w,B,u,x,t,s,n,C,q,v,A){function E(a){if(null!==a&&""!==a&&void 0!==a){var b=q("projects")+a+"/playbooks/";l.setUrl(b);l.get().success(function(a,b,d,c){r.playbook_options=[];for(b=0;b<a.length;b++)r.playbook_options.push(a[b])}).error(function(a,c,f,e){d(r,a,c,D,{hdr:"Error!",msg:"Failed to get playbook list for "+b+". GET returned status: "+c})})}}u("htmlTemplate");var F=q("jobs"),D=f,r=e.inject(D,{mode:"edit",related:!0});e.reset();var K=g.path().replace(/^\//,
"").split("/")[0],G={},I=p.id,H={};r.statusSearchSpin=!1;r.selectPlaybookUnregister&&r.selectPlaybookUnregister();r.selectPlaybookUnregister=r.$watch("project_name",function(a,b){a!==b&&(""!==b&&null!==b&&void 0!==b)&&(r.playbook=null,E(r.project))});r.jobLoadedRemove&&r.jobLoadedRemove();r.jobLoadedRemove=r.$on("jobLoaded",function(){r[D.name+"ReadOnly"]="new"==r.status?!1:!0;for(var a in H)r.search(H[a].iterator);E(r.project);$("#forks-slider").slider("option","value",r.forks);$("#forks-slider").slider("disable");
"").split("/")[0],G={},J=p.id,H={};r.statusSearchSpin=!1;r.selectPlaybookUnregister&&r.selectPlaybookUnregister();r.selectPlaybookUnregister=r.$watch("project_name",function(a,b){a!==b&&(""!==b&&null!==b&&void 0!==b)&&(r.playbook=null,E(r.project))});r.jobLoadedRemove&&r.jobLoadedRemove();r.jobLoadedRemove=r.$on("jobLoaded",function(){r[D.name+"ReadOnly"]="new"==r.status?!1:!0;for(var a in H)r.search(H[a].iterator);E(r.project);$("#forks-slider").slider("option","value",r.forks);$("#forks-slider").slider("disable");
l.setUrl(r.template_url);l.get().success(function(a,b,d,c){b=a.host_config_key?"true":"false";r.host_config_key=a.host_config_key;v({scope:r,master:G,check_field:"allow_callbacks",default_val:b});$('input[type="checkbox"]').attr("disabled","disabled");$("#host_config_key-gen-btn").attr("disabled","disabled")}).error(function(a,b,c,f){d(r,a,b,D,{hdr:"Error!",msg:"Failed to retrieve job: "+p.id+". GET status: "+b})})});r.job_type_options=[{value:"run",label:"Run"},{value:"check",label:"Check"}];r.verbosity_options=
[{value:"0",label:"Default"},{value:"1",label:"Verbose"},{value:"3",label:"Debug"}];r.playbook_options=null;r.playbook=null;l.setUrl(F+":id/");l.get({params:{id:I}}).success(function(a,d,c,f){b({path:"/job_templates/"+I,title:a.name});for(var e in D.fields){if(null!==a[e]&&void 0!==a[e]){if("select"==D.fields[e].type)if(r[e+"_options"]&&0<r[e+"_options"].length)for(d=0;d<r[e+"_options"].length;d++)a[e]==r[e+"_options"][d].value&&(r[e]=r[e+"_options"][d]);else r[e]=a[e];else r[e]=a[e];G[e]=r[e]}"lookup"==
[{value:"0",label:"Default"},{value:"1",label:"Verbose"},{value:"3",label:"Debug"}];r.playbook_options=null;r.playbook=null;l.setUrl(F+":id/");l.get({params:{id:J}}).success(function(a,d,c,f){b({path:"/job_templates/"+J,title:a.name});for(var e in D.fields){if(null!==a[e]&&void 0!==a[e]){if("select"==D.fields[e].type)if(r[e+"_options"]&&0<r[e+"_options"].length)for(d=0;d<r[e+"_options"].length;d++)a[e]==r[e+"_options"][d].value&&(r[e]=r[e+"_options"][d]);else r[e]=a[e];else r[e]=a[e];G[e]=r[e]}"lookup"==
D.fields[e].type&&a.summary_fields[D.fields[e].sourceModel]&&(r[D.fields[e].sourceModel+"_"+D.fields[e].sourceField]=a.summary_fields[D.fields[e].sourceModel][D.fields[e].sourceField],G[D.fields[e].sourceModel+"_"+D.fields[e].sourceField]=r[D.fields[e].sourceModel+"_"+D.fields[e].sourceField])}for(e in D.statusFields)null!==a[e]&&void 0!==a[e]&&("created"==e?r.created=A(new Date(a.created)):r[e]=a[e]);$('form[name="jobs_form"] input[type="text"], form[name="jobs_form"] jobs_form textarea').attr("readonly",
"readonly");$('form[name="jobs_form"] select').prop("disabled","disabled");$('form[name="jobs_form"] .lookup-btn').prop("disabled","disabled");$('form[name="jobs_form"] .buttons, form[name="jobs_form"] hr').hide();r.url=a.url;e=a.related;for(var l in D.related)e[l]&&(H[l]={url:e[l],iterator:D.related[l].iterator});n({scope:r,form:D,current_item:a.inventory,list:x,field:"inventory"});n({scope:r,form:D,current_item:a.credential,list:t,field:"credential"});n({scope:r,form:D,current_item:a.project,list:s,
field:"project"});z({scope:r,form:D,relatedSets:H});w({scope:r,relatedSets:H});r.template_url=a.related.job_template;r.$emit("jobLoaded")}).error(function(a,b,c,e){d(r,a,b,D,{hdr:"Error!",msg:"Failed to retrieve job: "+p.id+". GET status: "+b})});r.formSave=function(){l.setUrl(F+p.id+"/");var a={},b;for(b in D.fields)a[b]="select"==D.fields[b].type&&"playbook"!=b?r[b].value:r[b];l.put(a).success(function(a,b,d,c){"job_templates"==g.path().replace(/^\//,"").split("/")[0]?B():B(1)}).error(function(a,
b,c,e){d(r,a,b,D,{hdr:"Error!",msg:"Failed to update job "+p.id+". PUT returned status: "+b})})};r.formReset=function(){e.reset();for(var a in G)r[a]=G[a];$("#forks-slider").slider("option","value",r.forks)};r.add=function(a){m.flashMessage=null;g.path("/"+K+"/"+p.id+"/"+a)};r.edit=function(a,b,d){m.flashMessage=null;g.path("/"+K+"/"+p.id+"/"+a+"/"+b)};r["delete"]=function(a,b,c,e){m.flashMessage=null;Prompt({hdr:"Delete",body:"Are you sure you want to remove "+c+" from "+r.name+" "+e+"?",action:function(){var c=
F+I+"/"+a+"/";l.setUrl(c);l.post({id:b,disassociate:1}).success(function(b,d,c,e){$("#prompt-modal").modal("hide");r.search(D.related[a].iterator)}).error(function(a,b,e,f){$("#prompt-modal").modal("hide");d(r,a,b,null,{hdr:"Error!",msg:"Call to "+c+" failed. POST returned status: "+b})})}})};r.refresh=function(){r.statusSearchSpin=!0;l.setUrl(F+I+"/");l.get().success(function(a,b,d,c){r.status=a.status;r.result_stdout=a.result_stdout;r.result_traceback=a.result_traceback;r.statusSearchSpin=!1}).error(function(a,
b,c,e){d(r,a,b,null,{hdr:"Error!",msg:"Attempt to load job failed. GET returned status: "+b})})};r.jobSummary=function(){g.path("/jobs/"+I+"/job_host_summaries")};r.jobEvents=function(){g.path("/jobs/"+I+"/job_events")}}JobsEdit.$inject="$scope $rootScope $compile $location $log $routeParams JobForm GenerateForm Rest Alert ProcessErrors LoadBreadCrumbs RelatedSearchInit RelatedPaginateInit ReturnToCaller ClearScope InventoryList CredentialList ProjectList LookUpInit PromptPasswords GetBasePath md5Setup FormatDate".split(" ");function JobTemplatesList(h,m,k,g,c,p,f,e,l,a,d,b,z,w,B,u,x,t,s,n,C,q){B("htmlTemplate");var v=x("job_templates");h="job_templates"==k.path().replace(/^\//,"").split("/")[0]?"edit":"select";var A=l.inject(e,{mode:h});m.flashMessage=null;A.selected=[];A.PostRefreshRemove&&A.PostRefreshRemove();A.PostRefreshRemove=A.$on("PostRefresh",function(){$("tr.success").each(function(a){a=$(this).attr("ng-class");A[a]=""})});b({scope:A,set:"job_templates",list:e,url:v});z({scope:A,list:e,url:v});A.search(e.iterator);
F+J+"/"+a+"/";l.setUrl(c);l.post({id:b,disassociate:1}).success(function(b,d,c,e){$("#prompt-modal").modal("hide");r.search(D.related[a].iterator)}).error(function(a,b,e,f){$("#prompt-modal").modal("hide");d(r,a,b,null,{hdr:"Error!",msg:"Call to "+c+" failed. POST returned status: "+b})})}})};r.refresh=function(){r.statusSearchSpin=!0;l.setUrl(F+J+"/");l.get().success(function(a,b,d,c){r.status=a.status;r.result_stdout=a.result_stdout;r.result_traceback=a.result_traceback;r.statusSearchSpin=!1}).error(function(a,
b,c,e){d(r,a,b,null,{hdr:"Error!",msg:"Attempt to load job failed. GET returned status: "+b})})};r.jobSummary=function(){g.path("/jobs/"+J+"/job_host_summaries")};r.jobEvents=function(){g.path("/jobs/"+J+"/job_events")}}JobsEdit.$inject="$scope $rootScope $compile $location $log $routeParams JobForm GenerateForm Rest Alert ProcessErrors LoadBreadCrumbs RelatedSearchInit RelatedPaginateInit ReturnToCaller ClearScope InventoryList CredentialList ProjectList LookUpInit PromptPasswords GetBasePath md5Setup FormatDate".split(" ");function JobTemplatesList(h,m,k,g,c,p,f,e,l,a,d,b,z,w,B,u,x,t,s,n,C,q){B("htmlTemplate");var v=x("job_templates");h="job_templates"==k.path().replace(/^\//,"").split("/")[0]?"edit":"select";var A=l.inject(e,{mode:h});m.flashMessage=null;A.selected=[];A.PostRefreshRemove&&A.PostRefreshRemove();A.PostRefreshRemove=A.$on("PostRefresh",function(){$("tr.success").each(function(a){a=$(this).attr("ng-class");A[a]=""})});b({scope:A,set:"job_templates",list:e,url:v});z({scope:A,list:e,url:v});A.search(e.iterator);
a();A.addJobTemplate=function(){k.path(k.path()+"/add")};A.editJobTemplate=function(a){k.path(k.path()+"/"+a)};A.deleteJobTemplate=function(a,b){d({hdr:"Delete",body:"Are you sure you want to delete "+b+"?",action:function(){var b=v+a+"/";p.setUrl(b);p.destroy().success(function(a,b,d,c){$("#prompt-modal").modal("hide");A.search(e.iterator)}).error(function(a,d,c,e){$("#prompt-modal").modal("hide");u(A,a,d,null,{hdr:"Error!",msg:"Call to "+b+" failed. DELETE returned status: "+d})})}})};A.finishSelection=
function(){p.setUrl(v);A.queue=[];A.callFinishedRemove&&A.callFinishedRemove();A.callFinishedRemove=A.$on("callFinished",function(){if(A.queue.length==A.selected.length){$('input[type="checkbox"]').prop("checked",!1);A.selected=[];for(var a=0,b=0;b<A.queue.length;b++)"error"==A.queue[b].result&&a++;0<a?f("Error","There was an error while adding one or more of the selected templates."):w(1)}});if(0<A.selected.length)for(var a=null,b=0;b<A.selected.length;b++){for(var d=0;d<A.job_templates.length;d++)A.job_templates[d].id==
A.selected[b]&&(a=A.job_templates[d]);null!==a&&p.post(a).success(function(a,b,d,c){A.queue.push({result:"success",data:a,status:b});A.$emit("callFinished")}).error(function(a,b,d,c){A.queue.push({result:"error",data:a,status:b,headers:d});A.$emit("callFinished")})}else w(1)};A.toggle_job_template=function(a){"success"==A[e.iterator+"_"+a+"_class"]?(A[e.iterator+"_"+a+"_class"]="",document.getElementById("check_"+a).checked=!1,-1<A.selected.indexOf(a)&&A.selected.splice(A.selected.indexOf(a),1)):
@ -84,14 +84,13 @@ current_item:null,list:u,field:"inventory"});s({scope:v,form:f,current_item:null
b})})}});s({scope:v,form:f,current_item:null,list:t,field:"project"});v.formSave=function(){var b={};try{if("json"==v.parseType){JSON.parse(v.variables);var c=v.variables}else c=jsyaml.load(v.variables);for(var e in f.fields)"select"==f.fields[e].type&&"playbook"!=e?b[e]=v[e].value:"variables"!=e&&(b[e]=v[e]);b.extra_vars=JSON.stringify(c,void 0,"\t");l.setUrl(q);l.post(b).success(function(a,b,d,c){"job_templates"==g.path().replace(/^\//,"").split("/")[0]?z():z(1)}).error(function(a,b,c,e){d(v,a,
b,f,{hdr:"Error!",msg:"Failed to add new job template. POST returned status: "+b})})}catch(n){a("Error","Error parsing extra variables. Parser returned: "+n)}};v.formReset=function(){e.reset();$("#forks-slider").slider("option","value",v.forks);for(var a in A)v[a]=A[a]}}JobTemplatesAdd.$inject="$scope $rootScope $compile $location $log $routeParams JobTemplateForm GenerateForm Rest Alert ProcessErrors LoadBreadCrumbs ReturnToCaller ClearScope GetBasePath InventoryList CredentialList ProjectList LookUpInit md5Setup ParseTypeChange".split(" ");
function JobTemplatesEdit(h,m,k,g,c,p,f,e,l,a,d,b,z,w,B,u,x,t,s,n,C,q,v,A){function E(a){if(null!==a&&""!==a&&void 0!==a){var b=q("projects")+a+"/playbooks/";l.setUrl(b);l.get().success(function(a,b,d,c){r.playbook_options=[];for(b=0;b<a.length;b++)r.playbook_options.push(a[b])}).error(function(a,c,e,f){d(r,a,c,D,{hdr:"Error!",msg:"Failed to get playbook list for "+b+". GET returned status: "+c})})}}u("htmlTemplate");var F=q("job_templates"),D=f,r=e.inject(D,{mode:"edit",related:!0});r.parseType=
"yaml";A(r);r.job_type_options=[{value:"run",label:"Run"},{value:"check",label:"Check"}];r.verbosity_options=[{value:"0",label:"Default"},{value:"1",label:"Verbose"},{value:"3",label:"Debug"}];r.playbook_options=null;r.playbook=null;e.reset();var K=g.path().replace(/^\//,"").split("/")[0],G={},I=p.id,H={};r.selectPlaybookUnregister&&r.selectPlaybookUnregister();r.selectPlaybookUnregister=r.$watch("project_name",function(a,b){a!==b&&(""!==b&&null!==b&&void 0!==b)&&(r.playbook=null,E(r.project))});
r.jobTemplateLoadedRemove&&r.jobTemplateLoadedRemove();r.jobTemplateLoadedRemove=r.$on("jobTemplateLoaded",function(){for(var a in H)r.search(H[a].iterator);E(r.project);$("#forks-slider").slider("value",r.forks);v({scope:r,master:G,check_field:"allow_callbacks",default_val:r.host_config_key?"true":"false"})});l.setUrl(F+":id/");l.get({params:{id:I}}).success(function(a,d,c,e){b({path:"/job_templates/"+I,title:a.name});for(var f in D.fields){if("variables"!=f&&null!==a[f]&&void 0!==a[f]){if("select"==
D.fields[f].type)if(r[f+"_options"]&&0<r[f+"_options"].length)for(d=0;d<r[f+"_options"].length;d++)a[f]==r[f+"_options"][d].value&&(r[f]=r[f+"_options"][d]);else r[f]=a[f];else r[f]=a[f];G[f]=r[f]}"variables"==f&&($.isEmptyObject(a.extra_vars)||"{}"==a.extra_vars||"null"==a.extra_vars?r.variables="---":(d=JSON.parse(a.extra_vars),r.variables=jsyaml.safeDump(d),console.log(d)),G.variables=r.variables);"lookup"==D.fields[f].type&&a.summary_fields[D.fields[f].sourceModel]&&(r[D.fields[f].sourceModel+
"_"+D.fields[f].sourceField]=a.summary_fields[D.fields[f].sourceModel][D.fields[f].sourceField],G[D.fields[f].sourceModel+"_"+D.fields[f].sourceField]=r[D.fields[f].sourceModel+"_"+D.fields[f].sourceField])}r.url=a.url;f=a.related;for(var l in D.related)f[l]&&(H[l]={url:f[l],iterator:D.related[l].iterator});n({scope:r,form:D,current_item:a.inventory,list:x,field:"inventory"});n({scope:r,form:D,current_item:a.credential,list:t,field:"credential"});n({scope:r,form:D,current_item:a.project,list:s,field:"project"});
z({scope:r,form:D,relatedSets:H});w({scope:r,relatedSets:H});r.$emit("jobTemplateLoaded")}).error(function(a,b,c,f){d(r,a,b,D,{hdr:"Error!",msg:"Failed to retrieve job template: "+p.id+". GET status: "+b})});r.formSave=function(){var b={};try{var c="json"==r.parseType?JSON.parse(r.variables):jsyaml.load(r.variables),f;for(f in D.fields)"select"==D.fields[f].type&&"playbook"!=f?b[f]=r[f].value:"variables"!=f&&(b[f]=r[f]);b.extra_vars=JSON.stringify(c,void 0,"\t");l.setUrl(F+I+"/");l.put(b).success(function(a,
b,d,c){"job_templates"==g.path().replace(/^\//,"").split("/")[0]?B():B(1)}).error(function(a,b,c,f){d(r,a,b,D,{hdr:"Error!",msg:"Failed to update job template. PUT returned status: "+b})})}catch(e){a("Error","Error parsing extra variables. Parser returned: "+e)}};r.formReset=function(){e.reset();for(var a in G)r[a]=G[a];r.parseType="yaml";$("#forks-slider").slider("option","value",r.forks)};r.add=function(a){m.flashMessage=null;g.path("/"+K+"/"+p.id+"/"+a)};r.edit=function(a,b,d){m.flashMessage=null;
g.path("/"+a+"/"+b)};r["delete"]=function(a,b,c,f){m.flashMessage=null;Prompt({hdr:"Delete",body:"Are you sure you want to remove "+c+" from "+r.name+" "+f+"?",action:function(){var c=F+I+"/"+a+"/";l.setUrl(c);l.post({id:b,disassociate:1}).success(function(b,d,c,f){$("#prompt-modal").modal("hide");r.search(D.related[a].iterator)}).error(function(a,b,f,e){$("#prompt-modal").modal("hide");d(r,a,b,null,{hdr:"Error!",msg:"Call to "+c+" failed. POST returned status: "+b})})}})}}
JobTemplatesEdit.$inject="$scope $rootScope $compile $location $log $routeParams JobTemplateForm GenerateForm Rest Alert ProcessErrors LoadBreadCrumbs RelatedSearchInit RelatedPaginateInit ReturnToCaller ClearScope InventoryList CredentialList ProjectList LookUpInit PromptPasswords GetBasePath md5Setup ParseTypeChange".split(" ");function OrganizationsList(h,m,k,g,c,p,f,e,l,a,d,b,z,w,B){z("htmlTemplate");h="organizations"==k.path().replace(/^\//,"").split("/")[0]?"edit":"select";var u=l.inject(a,{mode:h}),x=B("organizations");m.flashMessage=null;f();u.PostRefreshRemove&&u.PostRefreshRemove();u.PostRefreshRemove=u.$on("PostRefresh",function(){$("tr.success").each(function(a){a=$(this).attr("ng-class");u[a]=""})});d({scope:u,set:a.name,list:a,url:x});b({scope:u,list:a,url:x});u.search(a.iterator);u.addOrganization=function(){k.path(k.path()+
"yaml";A(r);r.job_type_options=[{value:"run",label:"Run"},{value:"check",label:"Check"}];r.verbosity_options=[{value:"0",label:"Default"},{value:"1",label:"Verbose"},{value:"3",label:"Debug"}];r.playbook_options=null;r.playbook=null;e.reset();var K=g.path().replace(/^\//,"").split("/")[0],G={},J=p.id,H={};r.selectPlaybookUnregister&&r.selectPlaybookUnregister();r.selectPlaybookUnregister=r.$watch("project_name",function(a,b){a!==b&&(""!==b&&null!==b&&void 0!==b)&&(r.playbook=null,E(r.project))});
r.jobTemplateLoadedRemove&&r.jobTemplateLoadedRemove();r.jobTemplateLoadedRemove=r.$on("jobTemplateLoaded",function(){for(var a in H)r.search(H[a].iterator);E(r.project);$("#forks-slider").slider("value",r.forks);v({scope:r,master:G,check_field:"allow_callbacks",default_val:r.host_config_key?"true":"false"})});l.setUrl(F+":id/");l.get({params:{id:J}}).success(function(a,d,c,e){b({path:"/job_templates/"+J,title:a.name});for(var f in D.fields){if("variables"!=f&&null!==a[f]&&void 0!==a[f]){if("select"==
D.fields[f].type)if(r[f+"_options"]&&0<r[f+"_options"].length)for(d=0;d<r[f+"_options"].length;d++)a[f]==r[f+"_options"][d].value&&(r[f]=r[f+"_options"][d]);else r[f]=a[f];else r[f]=a[f];G[f]=r[f]}"variables"==f&&($.isEmptyObject(a.extra_vars)||"{}"==a.extra_vars||"null"==a.extra_vars?r.variables="---":(d=JSON.parse(a.extra_vars),r.variables=jsyaml.safeDump(d)),G.variables=r.variables);"lookup"==D.fields[f].type&&a.summary_fields[D.fields[f].sourceModel]&&(r[D.fields[f].sourceModel+"_"+D.fields[f].sourceField]=
a.summary_fields[D.fields[f].sourceModel][D.fields[f].sourceField],G[D.fields[f].sourceModel+"_"+D.fields[f].sourceField]=r[D.fields[f].sourceModel+"_"+D.fields[f].sourceField])}r.url=a.url;f=a.related;for(var l in D.related)f[l]&&(H[l]={url:f[l],iterator:D.related[l].iterator});n({scope:r,form:D,current_item:a.inventory,list:x,field:"inventory"});n({scope:r,form:D,current_item:a.credential,list:t,field:"credential"});n({scope:r,form:D,current_item:a.project,list:s,field:"project"});z({scope:r,form:D,
relatedSets:H});w({scope:r,relatedSets:H});r.$emit("jobTemplateLoaded")}).error(function(a,b,c,f){d(r,a,b,D,{hdr:"Error!",msg:"Failed to retrieve job template: "+p.id+". GET status: "+b})});r.formSave=function(){var b={};try{var c="json"==r.parseType?JSON.parse(r.variables):jsyaml.load(r.variables),f;for(f in D.fields)"select"==D.fields[f].type&&"playbook"!=f?b[f]=r[f].value:"variables"!=f&&(b[f]=r[f]);b.extra_vars=JSON.stringify(c,void 0,"\t");l.setUrl(F+J+"/");l.put(b).success(function(a,b,d,c){"job_templates"==
g.path().replace(/^\//,"").split("/")[0]?B():B(1)}).error(function(a,b,c,f){d(r,a,b,D,{hdr:"Error!",msg:"Failed to update job template. PUT returned status: "+b})})}catch(e){a("Error","Error parsing extra variables. Parser returned: "+e)}};r.formReset=function(){e.reset();for(var a in G)r[a]=G[a];r.parseType="yaml";$("#forks-slider").slider("option","value",r.forks)};r.add=function(a){m.flashMessage=null;g.path("/"+K+"/"+p.id+"/"+a)};r.edit=function(a,b,d){m.flashMessage=null;g.path("/"+a+"/"+b)};
r["delete"]=function(a,b,c,f){m.flashMessage=null;Prompt({hdr:"Delete",body:"Are you sure you want to remove "+c+" from "+r.name+" "+f+"?",action:function(){var c=F+J+"/"+a+"/";l.setUrl(c);l.post({id:b,disassociate:1}).success(function(b,d,c,f){$("#prompt-modal").modal("hide");r.search(D.related[a].iterator)}).error(function(a,b,f,e){$("#prompt-modal").modal("hide");d(r,a,b,null,{hdr:"Error!",msg:"Call to "+c+" failed. POST returned status: "+b})})}})}}JobTemplatesEdit.$inject="$scope $rootScope $compile $location $log $routeParams JobTemplateForm GenerateForm Rest Alert ProcessErrors LoadBreadCrumbs RelatedSearchInit RelatedPaginateInit ReturnToCaller ClearScope InventoryList CredentialList ProjectList LookUpInit PromptPasswords GetBasePath md5Setup ParseTypeChange".split(" ");function OrganizationsList(h,m,k,g,c,p,f,e,l,a,d,b,z,w,B){z("htmlTemplate");h="organizations"==k.path().replace(/^\//,"").split("/")[0]?"edit":"select";var u=l.inject(a,{mode:h}),x=B("organizations");m.flashMessage=null;f();u.PostRefreshRemove&&u.PostRefreshRemove();u.PostRefreshRemove=u.$on("PostRefresh",function(){$("tr.success").each(function(a){a=$(this).attr("ng-class");u[a]=""})});d({scope:u,set:a.name,list:a,url:x});b({scope:u,list:a,url:x});u.search(a.iterator);u.addOrganization=function(){k.path(k.path()+
"/add")};u.editOrganization=function(a){k.path(k.path()+"/"+a)};u.deleteOrganization=function(b,d){e({hdr:"Delete",body:"Are you sure you want to delete "+d+"?",action:function(){var d=x+b+"/";c.setUrl(d);c.destroy().success(function(b,d,c,f){$("#prompt-modal").modal("hide");u.search(a.iterator)}).error(function(a,b,c,f){$("#prompt-modal").modal("hide");w(u,a,b,null,{hdr:"Error!",msg:"Call to "+d+" failed. DELETE returned status: "+b})})}})};u.toggle_organization=function(b){"success"==u[a.iterator+
"_"+b+"_class"]?(u[a.iterator+"_"+b+"_class"]="",document.getElementById("check_"+b).checked=!1,-1<u.selected.indexOf(b)&&u.selected.splice(u.selected.indexOf(b),1)):(u[a.iterator+"_"+b+"_class"]="success",document.getElementById("check_"+b).checked=!0,-1==u.selected.indexOf(b)&&u.selected.push(b))}}OrganizationsList.$inject="$scope $rootScope $location $log Rest Alert LoadBreadCrumbs Prompt GenerateList OrganizationList SearchInit PaginateInit ClearScope ProcessErrors GetBasePath".split(" ");
function OrganizationsAdd(h,m,k,g,c,p,f,e,l,a,d,b,z,w,B){z("htmlTemplate");var u=e.inject(f,{mode:"add",related:!1}),x=w("organizations");e.reset();b();u.formSave=function(){l.setUrl(x);l.post({name:h.name,description:h.description}).success(function(a,b,d,c){m.flashMessage="New organization successfully created!";g.path("/organizations/"+a.id)}).error(function(a,b,c,e){d(u,a,b,f,{hdr:"Error!",msg:"Failed to add new organization. Post returned status: "+b})})};u.formReset=function(){m.flashMessage=
@ -145,9 +144,9 @@ dataContainer:"#form-modal"}},buttons:{save:{label:"Save",icon:"icon-ok","class"
type:"text",addRequired:!1,editRequired:!1},inventory:{type:"hidden",includeOnEdit:!0,includeOnAdd:!0},variables:{label:"Variables",type:"textarea",addRequired:!1,editRequird:!1,rows:10,"class":"modal-input-xlarge","default":"---",awPopOver:'<p>Enter variables using either JSON or YAML syntax. Use the radio button to toggle between the two.</p>JSON:<br />\n<blockquote>{<br />"somevar": "somevalue",<br />"password": "magic"<br /> }</blockquote>\nYAML:<br />\n<blockquote>---<br />somevar: somevalue<br />password: magic<br /></blockquote>\n<p>View JSON examples at <a href="http://www.json.org" target="_blank">www.json.org</a></p><p>View YAML examples at <a href="http://www.ansibleworks.com/docs/YAMLSyntax.html" target="_blank">ansibleworks.com</a></p>',
dataTitle:"Host Variables",dataPlacement:"right",dataContainer:"#form-modal"}},buttons:{save:{label:"Save",icon:"icon-ok","class":"btn-success",ngClick:"formSave()",ngDisabled:!0},reset:{ngClick:"formReset()",label:"Reset",icon:"icon-remove",ngDisabled:!0}},related:{}});angular.module("InventoryFormDefinition",[]).value("InventoryForm",{addTitle:"Create Inventory",editTitle:"{{ inventory_name }}",name:"inventory",well:!0,collapse:!0,collapseTitle:"Edit Inventory",collapseMode:"edit",twoColumns:!0,fields:{has_active_failures:{label:"Host Status",control:'<div class="job-failures-{{ has_active_failures }}"><i class="icon-exclamation-sign"></i> Failed jobs</div>',type:"custom",ngShow:"has_active_failures",readonly:!0,column:1},inventory_name:{realName:"name",label:"Name",
type:"text",addRequired:!0,editRequired:!0,capitalize:!1,column:1},inventory_description:{realName:"description",label:"Description",type:"text",addRequired:!1,editRequired:!1,column:1},organization:{label:"Organization",type:"lookup",sourceModel:"organization",sourceField:"name",addRequired:!0,editRequired:!0,ngClick:"lookUpOrganization()",column:1},variables:{label:"Variables",type:"textarea",addRequired:!1,editRequird:!1,rows:10,"class":"modal-input-xlarge","default":"---",awPopOver:'<p>Enter variables using either JSON or YAML syntax. Use the radio button to toggle between the two.</p><p>View JSON examples at <a href="http://www.json.org" target="_blank">www.json.org</a></p><p>View YAML examples at <a href="http://www.ansibleworks.com/docs/YAMLSyntax.html" target="_blank">ansibleworks.com</a></p>',
dataTitle:"Inventory Variables",dataPlacement:"bottom",column:2}},buttons:{save:{label:"Save",icon:"icon-ok","class":"btn-success",ngClick:"formSave()",ngDisabled:!0},reset:{ngClick:"formReset()",label:"Reset",icon:"icon-remove",ngDisabled:!0}},related:{groups:{type:"tree",open:!0,actions:{}},hosts:{type:"treeview",title:"{{ groupTitle }}",iterator:"host",actions:{add:{ngClick:"addHost()",icon:"icon-plus",label:"Add Host",awToolTip:"Add a host",ngHide:"createButtonShow == false"}},fields:{name:{key:!0,
label:"Host Name",ngClick:"editHost({{ host.id }}, '{{ host.name }}')"},has_active_failures:{label:"Failed jobs?",showValue:!1,ngClick:"showEvents('{{ host.name }}', '{{ host.related.last_job }}')",ngShow:"{{ host.has_active_failures }}",icon:"icon-exclamation-sign","class":"active-failures-{{ host.has_active_failures }}",text:"View failures",searchField:"has_active_failures",searchType:"boolean",searchOptions:[{name:"No",value:0},{name:"Yes",value:1}]}},fieldActions:{edit:{ngClick:"editHost({{ host.id }}, '{{ host.name }}')",
icon:"icon-edit",label:"Edit","class":"btn-success",awToolTip:"Edit host"},"delete":{ngClick:"deleteHost({{ host.id }}, '{{ host.name }}')",icon:"icon-remove",label:"Delete","class":"btn-danger",awToolTip:"Remove host"}}}}});angular.module("JobEventFormDefinition",[]).value("JobEventForm",{editTitle:"{{ id }} - {{ event }}",name:"job_events","class":"horizontal-narrow",well:!1,fields:{event_display:{label:"Event",type:"text",readonly:!0},created:{label:"Created",type:"text",readonly:!0,"class":"span3"},status:{label:"Status",type:"text","class":"job-{{ event_status }}",readonly:!0},host:{label:"Host",type:"text",readonly:!0},status:{label:"Status",type:"text","class":"job-{{ event_status }}",readonly:!0},event_data:{label:"Event Data",
dataTitle:"Inventory Variables",dataPlacement:"bottom",column:2}},buttons:{save:{label:"Save",icon:"icon-ok","class":"btn-success",ngClick:"formSave()",ngDisabled:!0},reset:{ngClick:"formReset()",label:"Reset",icon:"icon-remove",ngDisabled:!0}},related:{groups:{type:"tree",open:!0,actions:{}},hosts:{type:"treeview",title:"{{ groupTitle }}",iterator:"host",actions:{select:{ngClick:"selectHost()",icon:"icon-check",label:"Add Existing Host",awToolTip:"Select existing host",ngHide:"createButtonShow == false",
"class":"btn btn-pad"},create:{ngClick:"createHost()",icon:"icon-plus",label:"Create New Host",awToolTip:"Create a new host",ngHide:"createButtonShow == false","class":"btn-success"}},fields:{name:{key:!0,label:"Host Name",ngClick:"editHost({{ host.id }}, '{{ host.name }}')"},has_active_failures:{label:"Failed jobs?",showValue:!1,ngClick:"showEvents('{{ host.name }}', '{{ host.related.last_job }}')",ngShow:"{{ host.has_active_failures }}",icon:"icon-exclamation-sign","class":"active-failures-{{ host.has_active_failures }}",
text:"View failures",searchField:"has_active_failures",searchType:"boolean",searchOptions:[{name:"No",value:0},{name:"Yes",value:1}]}},fieldActions:{edit:{ngClick:"editHost({{ host.id }}, '{{ host.name }}')",icon:"icon-edit",label:"Edit","class":"btn-success",awToolTip:"Edit host"},"delete":{ngClick:"deleteHost({{ host.id }}, '{{ host.name }}')",icon:"icon-remove",label:"Delete","class":"btn-danger",awToolTip:"Remove host"}}}}});angular.module("JobEventFormDefinition",[]).value("JobEventForm",{editTitle:"{{ id }} - {{ event }}",name:"job_events","class":"horizontal-narrow",well:!1,fields:{event_display:{label:"Event",type:"text",readonly:!0},created:{label:"Created",type:"text",readonly:!0,"class":"span3"},status:{label:"Status",type:"text","class":"job-{{ event_status }}",readonly:!0},host:{label:"Host",type:"text",readonly:!0},status:{label:"Status",type:"text","class":"job-{{ event_status }}",readonly:!0},event_data:{label:"Event Data",
type:"textarea","class":"modal-input-xlarge",rows:10,readonly:!0}},buttons:{},related:{}});angular.module("JobFormDefinition",[]).value("JobForm",{addTitle:"Create Job",editTitle:"{{ name }}",name:"jobs",well:!0,twoColumns:!0,fields:{name:{label:"Name",type:"text",addRequired:!0,editRequired:!0,column:1},description:{label:"Description",type:"text",addRequired:!1,editRequired:!1,column:1},job_type:{label:"Job Type",type:"select",ngOptions:"type.label for type in job_type_options","default":"run",addRequired:!0,editRequired:!0,awPopOver:"<p>When this template is submitted as a job, setting the type to <em>run</em> will execute the playbook, running tasks on the selected hosts.</p> <p>Setting the type to <em>check</em> will not execute the playbook. Instead, ansible will check playbook syntax, test environment setup and report problems.</p>",
dataTitle:"Job Type",dataPlacement:"right",column:1},inventory:{label:"Inventory",type:"lookup",sourceModel:"inventory",sourceField:"name",addRequired:!0,editRequired:!0,ngClick:"lookUpInventory()",column:1},project:{label:"Project",type:"lookup",sourceModel:"project",sourceField:"name",addRequired:!0,editRequired:!0,ngClick:"lookUpProject()",column:1},playbook:{label:"Playbook",type:"select",ngOptions:"book for book in playbook_options",id:"playbook-select",addRequired:!0,editRequired:!0,column:1},
credential:{label:"Credential",type:"lookup",sourceModel:"credential",sourceField:"name",ngClick:"lookUpCredential()",addRequired:!1,editRequired:!1,column:2},forks:{label:"Forks",id:"forks-number",type:"number",integer:!0,min:0,max:100,slider:!0,"class":"input-mini","default":"0",addRequired:!1,editRequired:!1,column:2,awPopOver:"<p>The number of parallel or simultaneous processes to use while executing the playbook. Provide a value between 0 and 100. A value of zero will use the ansible default setting of 5 parallel processes.</p>",
@ -190,7 +189,7 @@ a})}));e||m("Access Denied","You do not have access to this function. Please con
c;b++)a[b].id==l&&(d=b,c=!0);"icon-expand-alt"==a[d].ngicon?f(d):e(d)}}]);angular.module("EventsHelper",["RestServices","Utilities","JobEventFormDefinition"]).factory("EventView",["$rootScope","$location","$log","$routeParams","Rest","Alert","JobEventForm","GenerateForm","Prompt","ProcessErrors","GetBasePath","FormatDate",function(h,m,k,g,c,p,f,e,l,a,d,b){return function(l){var k=l.event_id;l=d("base")+"job_events/"+k+"/";var g=e.inject(f,{mode:"edit",modal:!0,related:!1});e.reset();g.formModalAction=function(){$("#form-modal").modal("hide")};g.formModalActionLabel="OK";
g.formModalHeader="View Event";g.formModalCancelShow=!1;$("#form-modal .btn-success").removeClass("btn-success").addClass("btn-none");c.setUrl(l);c.get().success(function(a,d,c,e){for(var l in f.fields)"status"==l?g.status=a.failed?"error":"success":"event_data"==l?g.event_data=JSON.stringify(a.event_data,void 0,"\t"):"host"==l?a.summary_fields&&a.summary_fields.host&&(g.host=a.summary_fields.host.name):"event_display"==l?g.event_display=a.event_display.replace(/^\u00a0*/g,""):"created"==l?g.created=
b(new Date(a.created)):a[l]&&(g[l]=a[l])}).error(function(b,d,c,e){a(g,b,d,f,{hdr:"Error!",msg:"Failed to retrieve host: "+k+". GET status: "+d})});g.$$phase||g.$digest()}}]);angular.module("GroupsHelper","RestServices Utilities ListGenerator GroupListDefinition SearchHelper PaginateHelper ListGenerator AuthService GroupsHelper InventoryHelper".split(" ")).factory("GroupsList",["$rootScope","$location","$log","$routeParams","Rest","Alert","GroupList","GenerateList","Prompt","SearchInit","PaginateInit","ProcessErrors","GetBasePath","GroupsAdd","RefreshTree",function(h,m,k,g,c,p,f,e,l,a,d,b,z,w,B){return function(b){var l=b.inventory_id,k=void 0!==b.group_id?b.group_id:
null;b=z("inventory")+l+"/groups/";var h=e.inject(f,{id:"form-modal-body",mode:"select",breadCrumbs:!1,selectButton:!1});h.formModalActionLabel="Finished";h.formModalHeader="Add Group";h.formModalCancelShow=!0;h.formModalActionClass="btn btn-success";$("#form-modal .btn-none").removeClass("btn-none").addClass("btn-success");$("#form-modal").modal();h.selected=[];h.PostRefreshRemove&&h.PostRefreshRemove();h.PostRefreshRemove=h.$on("PostRefresh",function(){$("tr.success").each(function(a){a=$(this).attr("ng-class");
null;b=z("inventory")+l+"/groups/";var h=e.inject(f,{id:"form-modal-body",mode:"select",breadCrumbs:!1,selectButton:!1});h.formModalActionLabel="Select";h.formModalHeader="Add Groups";h.formModalCancelShow=!0;h.formModalActionClass="btn btn-success";$("#form-modal .btn-none").removeClass("btn-none").addClass("btn-success");$("#form-modal").modal();h.selected=[];h.PostRefreshRemove&&h.PostRefreshRemove();h.PostRefreshRemove=h.$on("PostRefresh",function(){$("tr.success").each(function(a){a=$(this).attr("ng-class");
h[a]=""});if(g.group_id)for(var a=0;a<h.groups.length;a++)h.groups[a].id==g.group_id&&h.groups.splice(a,1)});a({scope:h,set:"groups",list:f,url:b});d({scope:h,list:f,url:b,mode:"lookup"});h.search(f.iterator);h.$$phase||h.$digest();h.formModalAction=function(){var a=k?z("groups")+k+"/children/":z("inventory")+l+"/groups/";c.setUrl(a);h.queue=[];h.callFinishedRemove&&h.callFinishedRemove();h.callFinishedRemove=h.$on("callFinished",function(){if(h.queue.length==h.selected.length){$('input[type="checkbox"]').prop("checked",
!1);h.selected=[];for(var a=0,b=0;b<h.queue.length;b++)"error"==h.queue[b].result&&a++;0<a?p("Error","There was an error while adding one or more of the selected groups."):($("#form-modal").modal("hide"),B({scope:h}))}});if(0<h.selected.length)for(var b=0;b<h.selected.length;b++){for(var a=null,d=0;d<h.groups.length;d++)h.groups[d].id==h.selected[b]&&(a=h.groups[d]);null!==a&&c.post(a).success(function(a,b,d,c){h.queue.push({result:"success",data:a,status:b});h.$emit("callFinished")}).error(function(a,
b,d,c){h.queue.push({result:"error",data:a,status:b,headers:d});h.$emit("callFinished")})}else $("#form-modal").modal("hide")};h.toggle_group=function(a){"success"==h[f.iterator+"_"+a+"_class"]?(h[f.iterator+"_"+a+"_class"]="",document.getElementById("check_"+a).checked=!1,-1<h.selected.indexOf(a)&&h.selected.splice(h.selected.indexOf(a),1)):(h[f.iterator+"_"+a+"_class"]="success",document.getElementById("check_"+a).checked=!0,-1==h.selected.indexOf(a)&&h.selected.push(a))};h.createGroup=function(){$("#form-modal").modal("hide");
@ -201,23 +200,24 @@ b({scope:g})}).error(function(b,d,c,e){a(g,b,d,f,{hdr:"Error!",msg:"Failed to ad
function(){for(var b in n)t.search(n[b].iterator);t.variable_url?(c.setUrl(t.variable_url),c.get().success(function(a,b,d,c){$.isEmptyObject(a)?t.variables="---":t.variables=jsyaml.safeDump(a)}).error(function(b,d,c,e){t.variables=null;a(t,b,d,f,{hdr:"Error!",msg:"Failed to retrieve group variables. GET returned status: "+d})})):t.variables="---";s.variables=t.variables});c.setUrl(m);c.get().success(function(a,b,d,c){for(var e in f.fields)a[e]&&(t[e]=a[e],s[e]=t[e]);b=a.related;for(var l in f.related)b[l]&&
(n[l]={url:b[l],iterator:f.related[l].iterator});t.variable_url=a.related.variable_data;t.$emit("groupLoaded")}).error(function(b,d,c,e){a(t,b,d,f,{hdr:"Error!",msg:"Failed to retrieve group: "+id+". GET status: "+d})});t.$$phase||t.$digest();t.formModalAction=function(){try{if("json"==t.parseType){JSON.parse(t.variables);var e=t.variables}else e=jsyaml.load(t.variables);var l={},g;for(g in f.fields)l[g]=t[g];l.inventory=k;c.setUrl(m);c.put(l).success(function(l,h,k,g){t.variables?(c.setUrl(d("groups")+
l.id+"/variable_data/"),c.put(e).success(function(a,d,c,e){$("#form-modal").modal("hide");b({scope:t})}).error(function(b,d,c,e){a(t,b,d,f,{hdr:"Error!",msg:"Failed to update group varaibles. PUT returned status: "+d})})):($("#form-modal").modal("hide"),b({scope:t}))}).error(function(b,d,c,e){a(t,b,d,f,{hdr:"Error!",msg:"Failed to update group: "+h+". PUT status: "+d})})}catch(n){p("Error","Error parsing group variables. Parser returned: "+n)}};t.formReset=function(){e.reset();for(var a in s)t[a]=
s[a];t.parseType="yaml"}}}]).factory("GroupsDelete",["$rootScope","$location","$log","$routeParams","Rest","Alert","GroupForm","GenerateForm","Prompt","ProcessErrors","GetBasePath",function(h,m,k,g,c,p,f,e,l,a,d){return function(b){var e=b.scope,f=b.group_id;b=b.inventory_id;var l=$('#tree-view li[group_id="'+f+'"]'),h="LI"==l.parent().last().prop("tagName")?l.parent().last():l.parent().parent().last();console.log(h);var k;k="group"==h.attr("type")?d("base")+"groups/"+h.attr("group_id")+"/children/":
d("inventory")+b+"/groups/";$("#prompt-header").text("Delete Group");$("#prompt-body").text("Are you sure you want to remove group "+$(l).attr("name")+" from "+$(h).attr("name")+"?");$("#prompt-action-btn").addClass("btn-danger");e.promptAction=function(){c.setUrl(k);c.post({id:f,disassociate:1}).success(function(a,b,d,c){$("#prompt-modal").modal("hide");$("#tree-view").jstree("delete_node",l)}).error(function(b,d,c,f){$("#prompt-modal").modal("hide");RefreshTree({scope:e});a(e,b,d,null,{hdr:"Error!",
msg:"Call to "+k+" failed. DELETE returned status: "+d})})};$("#prompt-modal").modal({backdrop:"static",keyboard:!0,show:!0})}}]);angular.module("HostsHelper","RestServices Utilities ListGenerator HostListDefinition SearchHelper PaginateHelper ListGenerator AuthService HostsHelper InventoryHelper RelatedSearchHelper RelatedPaginateHelper InventoryFormDefinition".split(" ")).factory("HostsList",["$rootScope","$location","$log","$routeParams","Rest","Alert","HostList","GenerateList","Prompt","SearchInit","PaginateInit","ProcessErrors","GetBasePath","HostsAdd","HostsReload",function(h,m,k,g,c,p,f,e,l,a,d,b,z,w,B){return function(b){var l=
b.inventory_id,h=b.group_id,k=z("inventory")+l+"/hosts/",g=e.inject(f,{id:"form-modal-body",mode:"select",breadCrumbs:!1,selectButton:!1});g.formModalActionLabel="Finished";g.formModalHeader="Add Host";g.formModalCancelShow=!0;$("#form-modal .btn-none").removeClass("btn-none").addClass("btn-success");$("#form-modal").modal();$("#form-modal").unbind("hidden");$("#form-modal").on("hidden",function(){B(b)});g.selected=[];g.PostRefreshRemove&&g.PostRefreshRemove();g.PostRefreshRemove=g.$on("PostRefresh",
function(){$("tr.success").each(function(a){a=$(this).attr("ng-class");g[a]=""})});a({scope:g,set:"hosts",list:f,url:k});d({scope:g,list:f,url:k,mode:"lookup"});g.search(f.iterator);g.$$phase||g.$digest();g.formModalAction=function(){var a=z("groups")+h+"/hosts/";c.setUrl(a);g.queue=[];g.callFinishedRemove&&g.callFinishedRemove();g.callFinishedRemove=g.$on("callFinished",function(){if(g.queue.length==g.selected.length){$('input[type="checkbox"]').prop("checked",!1);g.selected=[];for(var a=0,d=0;d<
g.queue.length;d++)"error"==g.queue[d].result&&a++;0<a?p("Error","There was an error while adding one or more of the selected hosts."):($("#form-modal").modal("hide"),B(b))}});if(0<g.selected.length)for(var d=0;d<g.selected.length;d++){for(var a=null,e=0;e<g.hosts.length;e++)g.hosts[e].id==g.selected[d]&&(a=g.hosts[e]);null!==a&&c.post(a).success(function(a,b,d,c){g.queue.push({result:"success",data:a,status:b});g.$emit("callFinished")}).error(function(a,b,d,c){g.queue.push({result:"error",data:a,
status:b,headers:d});g.$emit("callFinished")})}else $("#form-modal").modal("hide")};g.toggle_host=function(a){"success"==g[f.iterator+"_"+a+"_class"]?(g[f.iterator+"_"+a+"_class"]="",document.getElementById("check_"+a).checked=!1,-1<g.selected.indexOf(a)&&g.selected.splice(g.selected.indexOf(a),1)):(g[f.iterator+"_"+a+"_class"]="success",document.getElementById("check_"+a).checked=!0,-1==g.selected.indexOf(a)&&g.selected.push(a))};g.createHost=function(){$("#form-modal").modal("hide");w({scope:b.scope,
inventory_id:l,group_id:h})}}}]).factory("HostsAdd",["$rootScope","$location","$log","$routeParams","Rest","Alert","HostForm","GenerateForm","Prompt","ProcessErrors","GetBasePath","HostsReload","ParseTypeChange",function(h,m,k,g,c,p,f,e,l,a,d,b,z){return function(l){var g=l.inventory_id,h=void 0!==l.group_id?l.group_id:null,k=d("groups")+h+"/hosts/",m=e.inject(f,{mode:"add",modal:!0,related:!1});m.formModalActionLabel="Save";m.formModalHeader="Create Host";m.formModalCancelShow=!0;m.parseType="yaml";
z(m);$("#form-modal .btn-none").removeClass("btn-none").addClass("btn-success");$("#form-modal").unbind("hidden");$("#form-modal").on("hidden",function(){b(l)});e.reset();m.$$phase||m.$digest();m.formModalAction=function(){try{if("json"==m.parseType){JSON.parse(m.variables);var b=m.variables}else b=jsyaml.load(m.variables);var d={},e;for(e in f.fields)"variables"!=e&&(d[e]=m[e]);d.inventory=g;c.setUrl(k);c.post(d).success(function(d,e,l,g){m.variables?(c.setUrl(d.related.variable_data),c.put(b).success(function(a,
b,d,c){$("#form-modal").modal("hide")}).error(function(b,d,c,e){a(m,b,d,f,{hdr:"Error!",msg:"Failed to add host varaibles. PUT returned status: "+d})})):$("#form-modal").modal("hide")}).error(function(b,d,c,e){a(m,b,d,f,{hdr:"Error!",msg:"Failed to add new host. POST returned status: "+d})})}catch(l){p("Error","Error parsing host variables. Parser returned: "+l)}};m.formReset=function(){e.reset()}}}]).factory("HostsEdit",["$rootScope","$location","$log","$routeParams","Rest","Alert","HostForm","GenerateForm",
"Prompt","ProcessErrors","GetBasePath","HostsReload","ParseTypeChange",function(h,m,k,g,c,p,f,e,l,a,d,b,z){return function(l){var g=l.host_id,h=l.inventory_id,k=d("hosts")+g+"/",m=e.inject(f,{mode:"edit",modal:!0,related:!1});e.reset();var s={};m.formModalActionLabel="Save";m.formModalHeader="Edit Host";m.formModalCancelShow=!0;m.parseType="yaml";z(m);$("#form-modal .btn-none").removeClass("btn-none").addClass("btn-success");$("#form-modal").unbind("hidden");$("#form-modal").on("hidden",function(){b(l)});
m.hostLoadedRemove&&m.hostLoadedRemove();m.hostLoadedRemove=m.$on("hostLoaded",function(){m.variable_url?(c.setUrl(m.variable_url),c.get().success(function(a,b,d,c){$.isEmptyObject(a)?m.variables="---":m.variables=jsyaml.safeDump(a)}).error(function(b,d,c,e){m.variables=null;a(m,b,d,f,{hdr:"Error!",msg:"Failed to retrieve host variables. GET returned status: "+d})})):m.variables="---";s.variables=m.variables});c.setUrl(k);c.get().success(function(a,b,d,c){for(var e in f.fields)a[e]&&(m[e]=a[e],s[e]=
m[e]);for(var l in f.related);m.variable_url=a.related.variable_data;m.$emit("hostLoaded")}).error(function(b,d,c,e){a(m,b,d,f,{hdr:"Error!",msg:"Failed to retrieve host: "+id+". GET returned status: "+d})});m.$$phase||m.$digest();m.formModalAction=function(){try{if("json"==m.parseType){JSON.parse(m.variables);var b=m.variables}else b=jsyaml.load(m.variables);var e={},l;for(l in f.fields)e[l]=m[l];e.inventory=h;c.setUrl(k);c.put(e).success(function(e,l,g,h){m.variables?(c.setUrl(d("hosts")+e.id+"/variable_data/"),
c.put(b).success(function(a,b,d,c){$("#form-modal").modal("hide")}).error(function(b,d,c,e){a(m,b,d,f,{hdr:"Error!",msg:"Failed to update host varaibles. PUT returned status: "+d})})):$("#form-modal").modal("hide")}).error(function(b,d,c,e){a(m,b,d,f,{hdr:"Error!",msg:"Failed to update host: "+g+". PUT returned status: "+d})})}catch(z){p("Error","Error parsing host variables. Parser returned: "+z)}};m.formReset=function(){e.reset();for(var a in s)m[a]=s[a];m.parseType="yaml"}}}]).factory("HostsDelete",
["$rootScope","$location","$log","$routeParams","Rest","Alert","Prompt","ProcessErrors","GetBasePath","HostsReload",function(h,m,k,g,c,p,f,e,l,a){return function(d){var b=d.scope,f=d.group_id,g=d.inventory_id,h=d.host_id,k=d.host_name,m=null!==f?l("groups")+f+"/hosts/":l("inventory")+g+"/hosts/";$("#prompt-header").text("Delete Host");$("#prompt-body").text("Are you sure you want to delete host "+k+"?");$("#prompt-action-btn").addClass("btn-danger");b.promptAction=function(){c.setUrl(m);c.post({id:h,
disassociate:1}).success(function(b,c,e,f){$("#prompt-modal").modal("hide");a(d)}).error(function(c,f,l,g){$("#prompt-modal").modal("hide");a(d);e(b,c,f,null,{hdr:"Error!",msg:"Call to "+m+" failed. DELETE returned status: "+f})})};$("#prompt-modal").modal({backdrop:"static",keyboard:!0,show:!0})}}]).factory("HostsReload",["RelatedSearchInit","RelatedPaginateInit","InventoryForm","GetBasePath",function(h,m,k,g){return function(c){var p={hosts:{url:null!==c.group_id?g("groups")+c.group_id+"/hosts/":
g("inventory")+c.inventory_id+"/hosts/",iterator:"host"}};h({scope:c.scope,form:k,relatedSets:p});m({scope:c.scope,relatedSets:p});c.scope.search("host");c.scope.$$phase||c.scope.$digest()}}]);angular.module("InventoryHelper","RestServices Utilities OrganizationListDefinition SearchHelper PaginateHelper ListGenerator AuthService InventoryHelper RelatedSearchHelper RelatedPaginateHelper InventoryFormDefinition".split(" ")).factory("LoadTreeData",["Alert","Rest","Authorization","$http",function(h,m,k,g){return function(c){var g=c.scope,f=c.inventory,e=f.related.root_groups,l=f.related.hosts,a=f.name,d=f.url,b=f.id,k=f.description,w=0,B=[];g.HostLoadedRemove&&g.HostLoadedRemove();g.HostLoadedRemove=
s[a];t.parseType="yaml"}}}]).factory("GroupsDelete",["$rootScope","$location","$log","$routeParams","Rest","Alert","GroupForm","GenerateForm","Prompt","ProcessErrors","GetBasePath",function(h,m,k,g,c,p,f,e,l,a,d){return function(b){var e=b.scope,f=b.group_id;b=b.inventory_id;var l=$('#tree-view li[group_id="'+f+'"]'),h="LI"==l.parent().last().prop("tagName")?l.parent().last():l.parent().parent().last(),k;k="group"==h.attr("type")?d("base")+"groups/"+h.attr("group_id")+"/children/":d("inventory")+
b+"/groups/";$("#prompt-header").text("Delete Group");$("#prompt-body").text("Are you sure you want to remove group "+$(l).attr("name")+" from "+$(h).attr("name")+"?");$("#prompt-action-btn").addClass("btn-danger");e.promptAction=function(){c.setUrl(k);c.post({id:f,disassociate:1}).success(function(a,b,d,c){$("#prompt-modal").modal("hide");$("#tree-view").jstree("delete_node",l)}).error(function(b,d,c,f){$("#prompt-modal").modal("hide");RefreshTree({scope:e});a(e,b,d,null,{hdr:"Error!",msg:"Call to "+
k+" failed. DELETE returned status: "+d})})};$("#prompt-modal").modal({backdrop:"static",keyboard:!0,show:!0})}}]);angular.module("HostsHelper","RestServices Utilities ListGenerator HostListDefinition SearchHelper PaginateHelper ListGenerator AuthService HostsHelper InventoryHelper RelatedSearchHelper RelatedPaginateHelper InventoryFormDefinition".split(" ")).factory("HostsList",["$rootScope","$location","$log","$routeParams","Rest","Alert","HostList","GenerateList","Prompt","SearchInit","PaginateInit","ProcessErrors","GetBasePath","HostsAdd","HostsReload",function(h,m,k,g,c,p,f,e,l,a,d,b,z,w,B){return function(b){var l=
b.inventory_id,h=b.group_id,k=z("inventory")+l+"/hosts/",g=e.inject(f,{id:"form-modal-body",mode:"select",breadCrumbs:!1,selectButton:!1});g.formModalActionLabel="Select";g.formModalHeader="Select Hosts";g.formModalCancelShow=!0;g.removeHostsReload&&g.removeHostsReload();g.removeHostsReload=g.$on("hostsReload",function(){B(b)});$("#form-modal .btn-none").removeClass("btn-none").addClass("btn-success");$("#form-modal").modal();$("#form-modal").unbind("hidden");$("#form-modal").on("hidden",function(){g.$emit("hostsReload")});
g.selected=[];g.PostRefreshRemove&&g.PostRefreshRemove();g.PostRefreshRemove=g.$on("PostRefresh",function(){$("tr.success").each(function(a){a=$(this).attr("ng-class");g[a]=""})});a({scope:g,set:"hosts",list:f,url:k});d({scope:g,list:f,url:k,mode:"lookup"});g.search(f.iterator);g.$$phase||g.$digest();g.formModalAction=function(){var a=z("groups")+h+"/hosts/";c.setUrl(a);g.queue=[];g.callFinishedRemove&&g.callFinishedRemove();g.callFinishedRemove=g.$on("callFinished",function(){if(g.queue.length==
g.selected.length){$('input[type="checkbox"]').prop("checked",!1);g.selected=[];for(var a=0,b=0;b<g.queue.length;b++)"error"==g.queue[b].result&&a++;0<a?p("Error","There was an error while adding one or more of the selected hosts."):($("#form-modal").modal("hide"),g.$emit("hostsReload"))}});if(0<g.selected.length)for(var b=0;b<g.selected.length;b++){for(var a=null,d=0;d<g.hosts.length;d++)g.hosts[d].id==g.selected[b]&&(a=g.hosts[d]);null!==a&&c.post(a).success(function(a,b,d,c){g.queue.push({result:"success",
data:a,status:b});g.$emit("callFinished")}).error(function(a,b,d,c){g.queue.push({result:"error",data:a,status:b,headers:d});g.$emit("callFinished")})}else $("#form-modal").modal("hide")};g.toggle_host=function(a){"success"==g[f.iterator+"_"+a+"_class"]?(g[f.iterator+"_"+a+"_class"]="",document.getElementById("check_"+a).checked=!1,-1<g.selected.indexOf(a)&&g.selected.splice(g.selected.indexOf(a),1)):(g[f.iterator+"_"+a+"_class"]="success",document.getElementById("check_"+a).checked=!0,-1==g.selected.indexOf(a)&&
g.selected.push(a))};g.createHost=function(){$("#form-modal").modal("hide");w({scope:b.scope,inventory_id:l,group_id:h})}}}]).factory("HostsAdd",["$rootScope","$location","$log","$routeParams","Rest","Alert","HostForm","GenerateForm","Prompt","ProcessErrors","GetBasePath","HostsReload","ParseTypeChange",function(h,m,k,g,c,p,f,e,l,a,d,b,z){return function(l){var g=l.inventory_id,h=void 0!==l.group_id?l.group_id:null,k=d("groups")+h+"/hosts/",m=e.inject(f,{mode:"add",modal:!0,related:!1});m.formModalActionLabel=
"Save";m.formModalHeader="Create Host";m.formModalCancelShow=!0;m.parseType="yaml";z(m);m.removeHostsReload&&m.removeHostsReload();m.removeHostsReload=m.$on("hostsReload",function(){b(l)});$("#form-modal .btn-none").removeClass("btn-none").addClass("btn-success");$("#form-modal").unbind("hidden");$("#form-modal").on("hidden",function(){m.$emit("hostsReload")});e.reset();m.$$phase||m.$digest();m.formModalAction=function(){try{if("json"==m.parseType){JSON.parse(m.variables);var b=m.variables}else b=
jsyaml.load(m.variables);var d={},e;for(e in f.fields)"variables"!=e&&(d[e]=m[e]);d.inventory=g;c.setUrl(k);c.post(d).success(function(d,e,l,g){m.variables?(c.setUrl(d.related.variable_data),c.put(b).success(function(a,b,d,c){$("#form-modal").modal("hide")}).error(function(b,d,c,e){a(m,b,d,f,{hdr:"Error!",msg:"Failed to add host varaibles. PUT returned status: "+d})})):$("#form-modal").modal("hide")}).error(function(b,d,c,e){a(m,b,d,f,{hdr:"Error!",msg:"Failed to add new host. POST returned status: "+
d})})}catch(l){p("Error","Error parsing host variables. Parser returned: "+l)}};m.formReset=function(){e.reset()}}}]).factory("HostsEdit",["$rootScope","$location","$log","$routeParams","Rest","Alert","HostForm","GenerateForm","Prompt","ProcessErrors","GetBasePath","HostsReload","ParseTypeChange",function(h,m,k,g,c,p,f,e,l,a,d,b,z){return function(l){var g=l.host_id,h=l.inventory_id,k=d("hosts")+g+"/",m=e.inject(f,{mode:"edit",modal:!0,related:!1});e.reset();var s={};m.formModalActionLabel="Save";
m.formModalHeader="Edit Host";m.formModalCancelShow=!0;m.parseType="yaml";z(m);m.removeHostsReload&&m.removeHostsReload();m.removeHostsReload=m.$on("hostsReload",function(){b(l)});$("#form-modal .btn-none").removeClass("btn-none").addClass("btn-success");$("#form-modal").unbind("hidden");$("#form-modal").on("hidden",function(){m.$emit("hostsReload")});m.hostLoadedRemove&&m.hostLoadedRemove();m.hostLoadedRemove=m.$on("hostLoaded",function(){m.variable_url?(c.setUrl(m.variable_url),c.get().success(function(a,
b,d,c){$.isEmptyObject(a)?m.variables="---":m.variables=jsyaml.safeDump(a)}).error(function(b,d,c,e){m.variables=null;a(m,b,d,f,{hdr:"Error!",msg:"Failed to retrieve host variables. GET returned status: "+d})})):m.variables="---";s.variables=m.variables});c.setUrl(k);c.get().success(function(a,b,d,c){for(var e in f.fields)a[e]&&(m[e]=a[e],s[e]=m[e]);for(var l in f.related);m.variable_url=a.related.variable_data;m.$emit("hostLoaded")}).error(function(b,d,c,e){a(m,b,d,f,{hdr:"Error!",msg:"Failed to retrieve host: "+
id+". GET returned status: "+d})});m.$$phase||m.$digest();m.formModalAction=function(){try{if("json"==m.parseType){JSON.parse(m.variables);var b=m.variables}else b=jsyaml.load(m.variables);var e={},l;for(l in f.fields)e[l]=m[l];e.inventory=h;c.setUrl(k);c.put(e).success(function(e,l,g,h){m.variables?(c.setUrl(d("hosts")+e.id+"/variable_data/"),c.put(b).success(function(a,b,d,c){$("#form-modal").modal("hide")}).error(function(b,d,c,e){a(m,b,d,f,{hdr:"Error!",msg:"Failed to update host varaibles. PUT returned status: "+
d})})):$("#form-modal").modal("hide")}).error(function(b,d,c,e){a(m,b,d,f,{hdr:"Error!",msg:"Failed to update host: "+g+". PUT returned status: "+d})})}catch(z){p("Error","Error parsing host variables. Parser returned: "+z)}};m.formReset=function(){e.reset();for(var a in s)m[a]=s[a];m.parseType="yaml"}}}]).factory("HostsDelete",["$rootScope","$location","$log","$routeParams","Rest","Alert","Prompt","ProcessErrors","GetBasePath","HostsReload",function(h,m,k,g,c,p,f,e,l,a){return function(d){var b=
d.scope,f=d.group_id,g=d.inventory_id,h=d.host_id,k=d.host_name,m=null!==f?l("groups")+f+"/hosts/":l("inventory")+g+"/hosts/";$("#prompt-header").text("Delete Host");$("#prompt-body").text("Are you sure you want to delete host "+k+"?");$("#prompt-action-btn").addClass("btn-danger");b.promptAction=function(){b.removeHostsReload&&b.removeHostsReload();b.removeHostsReload=b.$on("hostsReload",function(){a(d)});c.setUrl(m);c.post({id:h,disassociate:1}).success(function(a,d,c,e){$("#prompt-modal").modal("hide");
b.$emit("hostsReload")}).error(function(a,d,c,f){$("#prompt-modal").modal("hide");b.$emit("hostsReload");e(b,a,d,null,{hdr:"Error!",msg:"Call to "+m+" failed. DELETE returned status: "+d})})};$("#prompt-modal").modal({backdrop:"static",keyboard:!0,show:!0})}}]).factory("HostsReload",["RelatedSearchInit","RelatedPaginateInit","InventoryForm","GetBasePath",function(h,m,k,g){return function(c){scope=c.scope;var p={hosts:{url:null!==scope.group_id?g("groups")+scope.group_id+"/hosts/":g("inventory")+c.inventory_id+
"/hosts/",iterator:"host"}};h({scope:c.scope,form:k,relatedSets:p});m({scope:c.scope,relatedSets:p});c.scope.search("host");c.scope.$$phase||c.scope.$digest()}}]);angular.module("InventoryHelper","RestServices Utilities OrganizationListDefinition SearchHelper PaginateHelper ListGenerator AuthService InventoryHelper RelatedSearchHelper RelatedPaginateHelper InventoryFormDefinition".split(" ")).factory("LoadTreeData",["Alert","Rest","Authorization","$http",function(h,m,k,g){return function(c){var g=c.scope,f=c.inventory,e=f.related.root_groups,l=f.related.hosts,a=f.name,d=f.url,b=f.id,k=f.description,w=0,B=[];g.HostLoadedRemove&&g.HostLoadedRemove();g.HostLoadedRemove=
g.$on("hostsLoaded",function(){m.setUrl(e+"?"+(g.inventoryFailureFilter?"has_active_failures__int=1&":"")+"order_by=name");m.get().success(function(a,b,d,c){for(b=0;b<a.results.length;b++)B[0].children.push({data:{title:a.results[b].name},attr:{id:w,group_id:a.results[b].id,type:"group",name:a.results[b].name,description:a.results[b].description,inventory:a.results[b].inventory,all:a.results[b].related.all_hosts,children:a.results[b].related.children,hosts:a.results[b].related.hosts,variable:a.results[b].related.variable_data,
"data-failures":a.results[b].has_active_failures},state:"closed"}),w++;g.$emit("buildTree",B,w)}).error(function(a,b,d,c){h("Error","Failed to laod tree data. Url: "+e+" GET status: "+b)})});m.setUrl(l+"?order_by=name");m.get().success(function(c,e,h,m){B=[{data:{title:a},attr:{type:"inventory",id:"inventory-node",url:d,inventory_id:b,hosts:l,name:a,description:k,"data-failures":f.has_active_failures},state:"open",children:[]}];g.$emit("hostsLoaded")}).error(function(a,b,d,c){h("Error","Failed to laod tree data. Url: "+
l+" GET status: "+b)})}}]).factory("TreeInit",["Alert","Rest","Authorization","$http","LoadTreeData",function(h,m,k,g,c){return function(g){var f=g.scope;f.buildTreeRemove&&f.buildTreeRemove();f.buildTreeRemove=f.$on("buildTree",function(c,l,a){var d=a;$("#tree-view").jstree({core:{initially_open:["inventory-node"]},plugins:["themes","json_data","ui","contextmenu"],themes:{theme:"ansible",dots:!1,icons:!0},ui:{initially_select:["inventory-node"]},json_data:{data:l,ajax:{url:function(a){f.selected_node=
@ -258,15 +258,15 @@ c[a+"SearchValue"]||c[a+"SelectShow"]&&c[a+"SearchSelectValue"]||e.fields[c[a+"S
"SearchField"]].searchType||"boolean"==e.fields[c[a+"SearchField"]].searchType)?c[a+"SearchParams"]+"int=":e.fields[c[a+"SearchField"]].searchType&&"gtzero"==e.fields[c[a+"SearchField"]].searchType?c[a+"SearchParams"]+"gt=0":c[a+"SearchParams"]+(c[a+"SearchType"]+"="),c[a+"SearchParams"]=e.fields[c[a+"SearchField"]].searchType&&("boolean"==e.fields[c[a+"SearchField"]].searchType||"select"==e.fields[c[a+"SearchField"]].searchType)?c[a+"SearchParams"]+c[a+"SearchSelectValue"].value:c[a+"SearchParams"]+
escape(c[a+"SearchValue"]),c[a+"SearchParams"]+=l?"&order_by="+escape(l):""):c[a+"SearchParams"]=l?"order_by="+escape(l):"";c[a+"Page"]=0;b=/\/$/.test(b)?b+("?"+c[a+"SearchParams"]):b+("&"+c[a+"SearchParams"]);b=b.replace(/\&\&/,"&");b+=c[a+"PageSize"]?"&page_size="+c[a+"PageSize"]:"";k({scope:c,set:h,iterator:a,url:b})};c.sort=function(a){$(".list-header").each(function(b){$(this).attr("id")!=a+"-header"&&$(this).find("i").attr("class","icon-sort")});var b=$("#"+a+"-header i"),f="";b.hasClass("icon-sort")?
(b.removeClass("icon-sort"),b.addClass("icon-sort-up")):b.hasClass("icon-sort-up")?(b.removeClass("icon-sort-up"),b.addClass("icon-sort-down"),f="-"):b.hasClass("icon-sort-down")&&(b.removeClass("icon-sort-down"),b.addClass("icon-sort-up"));l=e.fields[a].searchField?f+e.fields[a].searchField:e.fields[a].sourceModel?f+e.fields[a].sourceModel+"__"+e.fields[a].sourceField:f+a;c.search(e.iterator)}}}]);angular.module("TeamHelper","RestServices Utilities OrganizationListDefinition SearchHelper PaginateHelper ListGenerator".split(" ")).factory("SetTeamListeners",["Alert","Rest",function(h,m){return function(h){var g=h.scope,c=h.set,p=h.iterator;g.$on("TeamResultFound",function(f,e,l){if(l.length==e.length){key="organization";property="organization_name";for(f=0;f<e.length;f++)for(var a=0;a<l.length;a++)e[f][key]==l[a].id&&(e[f][property]=l[a].value);g[p+"SearchSpin"]=!1;g[c]=e}});g.$on("TeamRefreshFinished",
function(c,e){for(var l=[],a=0;a<e.length;a++)m.setUrl("/api/v1/organizations/"+e[a].organization+"/"),m.get().success(function(a,b,c,f){console.log("here!");console.log(a);l.push({id:a.id,value:a.name});g.$emit("TeamResultFound",e,l)}).error(function(a,b,c,f){l.push({id:"error"});g.$emit("TeamResultFound",e,l)})})}}]).factory("TeamLookUpOrganizationInit",["Alert","Rest","OrganizationList","GenerateList","SearchInit","PaginateInit",function(h,m,k,g,c,p){return function(f){var e=f.scope;e.lookUpOrganization=
function(){var f=g.inject(k,{mode:"lookup",hdr:"Select Organization"});f.selectAction=function(){for(var a=!1,c=0;c<f[k.name].length;c++)"success"==f[k.iterator+"_"+f[k.name][c].id+"_class"]&&(a=!0,e.organization=f[k.name][c].id,e.organization_name=f[k.name][c].name,e.team_form.$setDirty(),g.hide());!1==a&&h("No Selection","Click on a row to select an Organization before clicking the Select button.")};f.toggle_organization=function(a){if(f[k.name])for(var c=0;c<f[k.name].length;c++)f[k.iterator+"_"+
f[k.name][c].id+"_class"]="";null!=a&&void 0!=a&&(f[k.iterator+"_"+a+"_class"]="success")};c({scope:f,set:k.name,list:k,url:"/api/v1/organizations/"});p({scope:f,list:k,url:"/api/v1/organizations/",mode:"lookup"});e.search(k.iterator);f.toggle_organization(e.organization)}}}]);angular.module("AdminListDefinition",[]).value("AdminList",{name:"admins",iterator:"admin",selectTitle:"Add Administrators",editTitle:"Admins",selectInstructions:"Click on a row to select it. Click the Finished button when done.",base:"users",index:!0,fields:{username:{key:!0,label:"Username"},first_name:{label:"First Name"},last_name:{label:"Last Name"}},actions:{},fieldActions:{}});angular.module("CredentialsListDefinition",[]).value("CredentialList",{name:"credentials",iterator:"credential",selectTitle:"Add Credentials",editTitle:"Credentials",selectInstructions:'Check the Select checkbox next to each credential to be added, and click Finished when done. Use the green <i class="icon-plus"></i> button to create a new user.',editInstructions:"Create a new credential from either the Teams tab or the Users tab. Teams and Users each have an associated set of Credentials.",index:!0,
function(c,e){for(var l=[],a=0;a<e.length;a++)m.setUrl("/api/v1/organizations/"+e[a].organization+"/"),m.get().success(function(a,b,c,f){l.push({id:a.id,value:a.name});g.$emit("TeamResultFound",e,l)}).error(function(a,b,c,f){l.push({id:"error"});g.$emit("TeamResultFound",e,l)})})}}]).factory("TeamLookUpOrganizationInit",["Alert","Rest","OrganizationList","GenerateList","SearchInit","PaginateInit",function(h,m,k,g,c,p){return function(f){var e=f.scope;e.lookUpOrganization=function(){var f=g.inject(k,
{mode:"lookup",hdr:"Select Organization"});f.selectAction=function(){for(var a=!1,c=0;c<f[k.name].length;c++)"success"==f[k.iterator+"_"+f[k.name][c].id+"_class"]&&(a=!0,e.organization=f[k.name][c].id,e.organization_name=f[k.name][c].name,e.team_form.$setDirty(),g.hide());!1==a&&h("No Selection","Click on a row to select an Organization before clicking the Select button.")};f.toggle_organization=function(a){if(f[k.name])for(var c=0;c<f[k.name].length;c++)f[k.iterator+"_"+f[k.name][c].id+"_class"]=
"";null!=a&&void 0!=a&&(f[k.iterator+"_"+a+"_class"]="success")};c({scope:f,set:k.name,list:k,url:"/api/v1/organizations/"});p({scope:f,list:k,url:"/api/v1/organizations/",mode:"lookup"});e.search(k.iterator);f.toggle_organization(e.organization)}}}]);angular.module("AdminListDefinition",[]).value("AdminList",{name:"admins",iterator:"admin",selectTitle:"Add Administrators",editTitle:"Admins",selectInstructions:"Click on a row to select it. Click the Finished button when done.",base:"users",index:!0,fields:{username:{key:!0,label:"Username"},first_name:{label:"First Name"},last_name:{label:"Last Name"}},actions:{},fieldActions:{}});angular.module("CredentialsListDefinition",[]).value("CredentialList",{name:"credentials",iterator:"credential",selectTitle:"Add Credentials",editTitle:"Credentials",selectInstructions:'Check the Select checkbox next to each credential to be added, and click Finished when done. Use the green <i class="icon-plus"></i> button to create a new user.',editInstructions:"Create a new credential from either the Teams tab or the Users tab. Teams and Users each have an associated set of Credentials.",index:!0,
hover:!0,fields:{name:{key:!0,label:"Name"},description:{label:"Description"},team:{label:"Team",ngBind:"credential.summary_fields.team.name",sourceModel:"team",sourceField:"name"},user:{label:"User",ngBind:"credential.summary_fields.user.usename",sourceModel:"user",sourceField:"username"}},actions:{add:{icon:"icon-plus",label:"Add",mode:"all",ngClick:"addCredential()",basePaths:["teams","users"],"class":"btn-success btn-small",awToolTip:"Create a new credential"}},fieldActions:{edit:{ngClick:"editCredential({{ credential.id }})",
icon:"icon-edit",label:"Edit","class":"btn-small btn-success",awToolTip:"View/Edit credential"},"delete":{ngClick:"deleteCredential({{ credential.id }},'{{ credential.name }}')",icon:"icon-remove",label:"Delete","class":"btn-small btn-danger",awToolTip:"Delete credential"}}});angular.module("GroupListDefinition",[]).value("GroupList",{name:"groups",iterator:"group",selectTitle:"Add Group",editTitle:"Groups",selectInstructions:'Click on a row to select it, and Finished when done. Click the green <i class="icon-plus"></i> Add to create a new row.',index:!0,well:!1,fields:{name:{key:!0,label:"Name"},description:{label:"Description"}},actions:{add:{label:"Add",icon:"icon-plus",mode:"all",ngClick:"createGroup()","class":"btn-success btn-small",awToolTip:"Create a new group"}},
fieldActions:{edit:{label:"Edit",ngClick:"editGroup({{ group.id }})",icon:"icon-edit","class":"btn-small btn-success",awToolTip:"View/Edit group"},"delete":{label:"Delete",ngClick:"deleteGroup({{ group.id }},'{{ group.name }}')",icon:"icon-remove","class":"btn-small btn-danger",awToolTip:"Delete group"}}});angular.module("HostListDefinition",[]).value("HostList",{name:"hosts",iterator:"host",selectTitle:"Add Host",selectInstructions:'Click on a row to select it, and click Finished when done. Use the green <i class="icon-plus"></i> button to create a new row.',editTitle:"Hosts",index:!0,well:!0,fields:{name:{key:!0,label:"Name",linkTo:"/inventories/{{ inventory_id }}/hosts/{{ host.id }}"},description:{label:"Description"}},actions:{add:{icon:"icon-plus",label:"Add",mode:"all",ngClick:"createHost()",
ngHide:"showAddButton == false","class":"btn-success btn-small",awToolTip:"Create a new host"}},fieldActions:{edit:{label:"Edit",ngClick:"editHost({{ host.id }})",icon:"icon-edit","class":"btn-small btn-success",awToolTip:"View/Edit host"},"delete":{label:"Delete",ngClick:"deleteHost({{ host.id }},'{{ host.name }}')",icon:"icon-remove","class":"btn-small btn-danger",awToolTip:"Delete host"}}});angular.module("InventoriesListDefinition",[]).value("InventoryList",{name:"inventories",iterator:"inventory",selectTitle:"Add Inventories",editTitle:"Inventories",selectInstructions:'Click on a row to select it, and click Finished when done. Use the green <i class="icon-plus"></i> button to create a new row.',index:!0,hover:!0,fields:{name:{key:!0,label:"Name"},description:{label:"Descriptions"},organization:{label:"Organization",ngBind:"inventory.summary_fields.organization.name",sourceModel:"organization",
icon:"icon-edit",label:"Edit","class":"btn-small btn-success",awToolTip:"View/Edit credential"},"delete":{ngClick:"deleteCredential({{ credential.id }},'{{ credential.name }}')",icon:"icon-remove",label:"Delete","class":"btn-small btn-danger",awToolTip:"Delete credential"}}});angular.module("GroupListDefinition",[]).value("GroupList",{name:"groups",iterator:"group",selectTitle:"Add Group",editTitle:"Groups",index:!0,well:!1,fields:{name:{key:!0,label:"Name"},description:{label:"Description"}},actions:{add:{label:"Create New Group",icon:"icon-plus",mode:"all",ngClick:"createGroup()","class":"btn-success btn-small",awToolTip:"Create a new group"}},fieldActions:{edit:{label:"Edit",ngClick:"editGroup({{ group.id }})",icon:"icon-edit","class":"btn-small btn-success",awToolTip:"View/Edit group"},
"delete":{label:"Delete",ngClick:"deleteGroup({{ group.id }},'{{ group.name }}')",icon:"icon-remove","class":"btn-small btn-danger",awToolTip:"Delete group"}}});angular.module("HostListDefinition",[]).value("HostList",{name:"hosts",iterator:"host",selectTitle:"Select Host",editTitle:"Hosts",index:!0,well:!0,fields:{name:{key:!0,label:"Host Name",linkTo:"/inventories/{{ inventory_id }}/hosts/{{ host.id }}"},description:{label:"Description"}},actions:{},fieldActions:{edit:{label:"Edit",ngClick:"editHost({{ host.id }})",icon:"icon-edit","class":"btn-small btn-success",awToolTip:"View/Edit host"},"delete":{label:"Delete",ngClick:"deleteHost({{ host.id }},'{{ host.name }}')",
icon:"icon-remove","class":"btn-small btn-danger",awToolTip:"Delete host"}}});angular.module("InventoriesListDefinition",[]).value("InventoryList",{name:"inventories",iterator:"inventory",selectTitle:"Add Inventories",editTitle:"Inventories",selectInstructions:'Click on a row to select it, and click Finished when done. Use the green <i class="icon-plus"></i> button to create a new row.',index:!0,hover:!0,fields:{name:{key:!0,label:"Name"},description:{label:"Descriptions"},organization:{label:"Organization",ngBind:"inventory.summary_fields.organization.name",sourceModel:"organization",
sourceField:"name"},has_active_failures:{label:"Failed Jobs?",showValue:!1,text:"View failures",ngShow:"{{ inventory.has_active_failures }}",icon:"icon-exclamation-sign","class":"active-failures-{{ inventory.has_active_failures }}",ngClick:"viewJobs({{ inventory.id }})",searchField:"has_active_failures",searchType:"boolean",searchOptions:[{name:"No",value:0},{name:"Yes",value:1}],excludeModal:!0}},actions:{add:{label:"Add",icon:"icon-plus",mode:"all",ngClick:"addInventory()","class":"btn-small btn-success",
awToolTip:"Create a new row"}},fieldActions:{edit:{label:"Edit",ngClick:"editInventory({{ inventory.id }})",icon:"icon-edit","class":"btn-small btn-success",awToolTip:"View/Edit inventory"},"delete":{label:"Delete",ngClick:"deleteInventory({{ inventory.id }},'{{ inventory.name }}')",icon:"icon-remove","class":"btn-small btn-danger",awToolTip:"Delete inventory"}}});angular.module("JobEventsListDefinition",[]).value("JobEventList",{name:"jobevents",iterator:"jobevent",editTitle:"Job Events",index:!1,hover:!0,hasChildren:!0,filterBy:"{ show: true }",fields:{created:{label:"Date",key:!0,nosort:!0,searchable:!1,link:!1},status:{label:"Status",icon:"icon-circle","class":"job-{{ jobevent.status }}",searchField:"failed",searchType:"boolean",searchOptions:[{name:"success",value:0},{name:"error",value:1}],nosort:!0,searchable:!1},event_display:{label:"Event",hasChildren:!0,
awToolTip:"Create a new inventory"}},fieldActions:{edit:{label:"Edit",ngClick:"editInventory({{ inventory.id }})",icon:"icon-edit","class":"btn-small btn-success",awToolTip:"View/Edit inventory"},"delete":{label:"Delete",ngClick:"deleteInventory({{ inventory.id }},'{{ inventory.name }}')",icon:"icon-remove","class":"btn-small btn-danger",awToolTip:"Delete inventory"}}});angular.module("JobEventsListDefinition",[]).value("JobEventList",{name:"jobevents",iterator:"jobevent",editTitle:"Job Events",index:!1,hover:!0,hasChildren:!0,filterBy:"{ show: true }",fields:{created:{label:"Date",key:!0,nosort:!0,searchable:!1,link:!1},status:{label:"Status",icon:"icon-circle","class":"job-{{ jobevent.status }}",searchField:"failed",searchType:"boolean",searchOptions:[{name:"success",value:0},{name:"error",value:1}],nosort:!0,searchable:!1},event_display:{label:"Event",hasChildren:!0,
ngClick:"toggleChildren({{ jobevent.id }}, '{{ jobevent.related.children }}')",nosort:!0,searchable:!1,ngClass:"{{ jobevent.class }}",appendHTML:"jobevent.event_detail"},host:{label:"Host",ngBind:"jobevent.summary_fields.host.name",searchField:"hosts__name",nosort:!0,id:"job-event-host-header"}},actions:{refresh:{ngClick:"refresh()",icon:"icon-refresh",label:"Refresh",awToolTip:"Refresh the page","class":"btn-small btn-success",mode:"all"},edit:{label:"Details",ngClick:"jobDetails()",icon:"icon-zoom-in",
"class":"btn btn-small",awToolTip:"Edit job details",mode:"all"},summary:{label:"Hosts",icon:"icon-th-large",ngClick:"jobSummary()","class":"btn btn-small",awToolTip:"View host summary",mode:"all"}},fieldActions:{edit:{label:"View",ngClick:"viewJobEvent({{ jobevent.id }})",icon:"icon-zoom-in","class":"btn-small",awToolTip:"View event details"}}});angular.module("JobHostDefinition",[]).value("JobHostList",{name:"jobhosts",iterator:"jobhost",editTitle:"Job Host Summary",index:!0,hover:!0,fields:{host:{label:"Host",key:!0,sourceModel:"host",sourceField:"name",ngBind:"jobhost.host_name",ngClick:"showEvents('{{ jobhost.summary_fields.host.name }}','{{ jobhost.related.job }}')"},status:{label:"Status",icon:"icon-circle","class":"job-{{ jobhost.status }}",searchField:"failed",searchType:"boolean",searchOptions:[{name:"success",value:0},{name:"error",
value:1}]},ok:{label:"Success",searchable:!1},changed:{label:"Changed",searchable:!1},failures:{label:"Failure",searchType:"gtzero"},dark:{label:"Unreachable",searchable:!1},skipped:{label:"Skipped",searchable:!1}},actions:{refresh:{label:"Refresh",icon:"icon-refresh",ngClick:"refresh()","class":"btn-success btn-small",awToolTip:"Refresh the page",mode:"all"},edit:{label:"Details",icon:"icon-edit",ngClick:"jobDetails()","class":"btn btn-small",awToolTip:"Edit job details",mode:"all"},events:{label:"Events",
@ -275,8 +275,8 @@ icon:"icon-list-ul",ngClick:"jobEvents()","class":"btn btn-small",awToolTip:"Vie
events:{label:"Events",icon:"icon-list-ul",mode:"all",ngClick:"viewEvents({{ job.id }}, '{{ job.name }}')","class":"btn btn-small",awToolTip:"View events",ngDisabled:"job.status == 'new'"},edit:{label:"Details",icon:"icon-zoom-in",ngClick:"editJob({{ job.id }}, '{{ job.name }}')","class":"btn btn-small",awToolTip:"View job details"},rerun:{icon:"icon-retweet",mode:"all",ngClick:"submitJob({{ job.id }}, '{{ job.summary_fields.job_template.name }}' )","class":"btn-success btn-small",awToolTip:"Re-run this job"},
cancel:{icon:"icon-minus-sign",mode:"all",ngClick:"deleteJob({{ job.id }})","class":"btn-danger btn-small",awToolTip:"Cancel job",ngDisabled:"job.status != 'new' && job.status != 'pending' && job.status != 'running'"}}});angular.module("JobTemplatesListDefinition",[]).value("JobTemplateList",{name:"job_templates",iterator:"job_template",selectTitle:"Add Job Template",editTitle:"Job Templates",selectInstructions:'Click on a row to select it, and click Finished when done. Use the green <i class="icon-plus"></i> button to create a new row.',index:!0,hover:!0,fields:{name:{key:!0,label:"Name"},description:{label:"Description"}},actions:{add:{label:"Add",icon:"icon-plus",mode:"all",ngClick:"addJobTemplate()","class":"btn-success btn-small",
basePaths:["job_templates"],awToolTip:"Create a new template"}},fieldActions:{edit:{label:"Edit",ngClick:"editJobTemplate({{ job_template.id }})",icon:"icon-edit",awToolTip:"Edit template","class":"btn-small btn-success"},submit:{label:"Launch",icon:"icon-rocket",mode:"all","class":"btn-small btn-success",ngClick:"submitJob({{ job_template.id }})",awToolTip:"Start a job using this template"},"delete":{label:"Delete",ngClick:"deleteJobTemplate({{ job_template.id }},'{{ job_template.name }}')",icon:"icon-remove",
"class":"btn-danger btn-small",awToolTip:"Delete template"}}});angular.module("OrganizationListDefinition",[]).value("OrganizationList",{name:"organizations",iterator:"organization",selectTitle:"Add Organizations",editTitle:"Organizations",hover:!0,index:!0,fields:{name:{key:!0,label:"Name"},description:{label:"Description"}},actions:{add:{label:"Add",icon:"icon-plus",mode:"all",ngClick:"addOrganization()","class":"btn-success btn-small",awToolTip:"Create a new row"}},fieldActions:{edit:{label:"Edit",ngClick:"editOrganization({{ organization.id }})",icon:"icon-edit",
"class":"btn-small btn-success",awToolTip:"View/Edit organization"},"delete":{label:"Delete",ngClick:"deleteOrganization({{ organization.id }},'{{ organization.name }}')",icon:"icon-remove","class":"btn-small btn-danger",awToolTip:"Delete organization"}}});angular.module("PermissionListDefinition",[]).value("PermissionList",{name:"permissions",iterator:"permission",selectTitle:"Add Permission",selectInstructions:'Click on a row to select it, and click Finished when done. Use the green <i class="icon-plus"></i> button to create a new row.',editTitle:"Permissions",index:!0,well:!0,fields:{name:{key:!0,label:"Name",ngClick:"editPermission({{ permission.id }})"},inventory:{label:"Inventory",sourceModel:"inventory",sourceField:"name",ngBind:"permission.summary_fields.inventory.name"},
"class":"btn-danger btn-small",awToolTip:"Delete template"}}});angular.module("OrganizationListDefinition",[]).value("OrganizationList",{name:"organizations",iterator:"organization",selectTitle:"Add Organizations",editTitle:"Organizations",hover:!0,index:!0,fields:{name:{key:!0,label:"Name"},description:{label:"Description"}},actions:{add:{label:"Add",icon:"icon-plus",mode:"all",ngClick:"addOrganization()","class":"btn-success btn-small",awToolTip:"Create a new organization"}},fieldActions:{edit:{label:"Edit",ngClick:"editOrganization({{ organization.id }})",
icon:"icon-edit","class":"btn-small btn-success",awToolTip:"View/Edit organization"},"delete":{label:"Delete",ngClick:"deleteOrganization({{ organization.id }},'{{ organization.name }}')",icon:"icon-remove","class":"btn-small btn-danger",awToolTip:"Delete organization"}}});angular.module("PermissionListDefinition",[]).value("PermissionList",{name:"permissions",iterator:"permission",selectTitle:"Add Permission",selectInstructions:'Click on a row to select it, and click Finished when done. Use the green <i class="icon-plus"></i> button to create a new row.',editTitle:"Permissions",index:!0,well:!0,fields:{name:{key:!0,label:"Name",ngClick:"editPermission({{ permission.id }})"},inventory:{label:"Inventory",sourceModel:"inventory",sourceField:"name",ngBind:"permission.summary_fields.inventory.name"},
project:{label:"Project",sourceModel:"project",sourceField:"name",ngBind:"permission.summary_fields.project.name"},permission_type:{label:"Permission"}},actions:{add:{icon:"icon-plus",label:"Add",mode:"all",ngClick:"addPermission()","class":"btn-success btn-small",awToolTip:"Add a new permission"}},fieldActions:{edit:{label:"Edit",ngClick:"editPermission({{ permission.id }})",icon:"icon-edit","class":"btn-small btn-success",awToolTip:"View/Edit permission"},"delete":{label:"Delete",ngClick:"deletePermission({{ permission.id }},'{{ permission.name }}')",
icon:"icon-remove","class":"btn-small btn-danger",awToolTip:"Delete permission"}}});angular.module("ProjectsListDefinition",[]).value("ProjectList",{name:"projects",iterator:"project",selectTitle:"Add Project",editTitle:"{{ name }}",selectInstructions:'Click on a row to select it, and click Finished when done. Use the green <i class="icon-plus"></i> button to create a new row.',index:!0,hover:!0,fields:{name:{key:!0,label:"Name"},description:{label:"Descriptions"}},actions:{add:{label:"Add",icon:"icon-plus",mode:"all",ngClick:"addProject()","class":"btn-success btn-small",awToolTip:"Create a new project"}},
fieldActions:{edit:{label:"Edit",ngClick:"editProject({{ project.id }})",icon:"icon-edit","class":"btn-small btn-success",awToolTip:"View/edit project"},"delete":{label:"Delete",ngClick:"deleteProject({{ project.id }},'{{ project.name }}')",icon:"icon-remove","class":"btn-small btn-danger",awToolTip:"Delete project"}}});angular.module("TeamsListDefinition",[]).value("TeamList",{name:"teams",iterator:"team",selectTitle:"Add Team",editTitle:"Teams",selectInstructions:'Click on a row to select it, and click Finished when done. Use the green <i class="icon-plus"></i> button to create a new row.',index:!0,hover:!0,fields:{name:{key:!0,label:"Name"},description:{label:"Descriptions"},organization:{label:"Organization",ngBind:"team.organization_name",sourceModel:"organization",sourceField:"name"}},actions:{add:{label:"Add",
@ -331,18 +331,18 @@ a+='<li ng-class="'+this.form.items[itm].iterator+'NextUrlDisable"><a href="" ng
'PrevUrlDisable"><a href="" ng-click="prevSet(\''+this.form.items[itm].set+"','"+this.form.items[itm].iterator+"')\">&larr; Prev</a></li>\n";a+='<li ng-class="'+this.form.items[itm].iterator+'NextUrlDisable"><a href="" ng-click="nextSet(\''+this.form.items[itm].set+"','"+this.form.items[itm].iterator+"')\">&rarr; Next</a></li>\n";a+="</ul>\n";a+="</div>\x3c!-- well --\x3e\n"}"inventory"==this.form.name&&"edit"==c.mode?a+=this.buildTree(c):!this.modal&&(c.related&&this.form.related)&&(a+=this.buildCollections(c));
return a},buildTree:function(f){var a=1,d=this.form;html='<div id="'+this.form.name+'-collapse-2" data-open="true" class="jqui-accordion">\n';html+="<h3>Inventory Content<h3>\n";html+="<div>\n";for(var b in d.related){if("tree"==d.related[b].type)html+='<div class="span5">',html+='<div class="inventory-buttons">',html+='<button ng-click="addGroup()" ng-hide="groupAddHide" id="inv-group-add" class="btn btn-mini btn-success"><i class="icon-plus"></i> Add Group</button>',html+='<button ng-click="editGroup()" ng-hide="groupEditHide" id="inv-group-edit" class="btn btn-mini btn-success"><i class="icon-edit"></i> Edit Group</button>',
html+='<button ng-click="deleteGroup()" ng-hide="groupDeleteHide" id="inv-group-delete" class="btn btn-mini btn-danger"><i class="icon-remove"></i> Delete Group</button>',html+="</div>\n",html+='<div id="tree-view"></div>\n',html+='<div class=" inventory-filter" ng-show="has_active_failures == true"><label class="checkbox inline"><input ng-model="inventoryFailureFilter" ng-change="filterInventory()" type="checkbox" >Show only groups with failures</label></div>\n',html+="</div>\n";else{html+='<div id="group-view" class="span7">\n';
html+='<div id="hosts-well" class="well">\n';html+='<h4 id="hosts-title">'+d.related[b].title+"</h4>\n";html+=g({iterator:d.related[b].iterator,template:d.related[b],mini:!0});html+='<div class="list-actions">\n';for(var h in d.related[b].actions)html+='<button class="btn btn-mini btn-success" ',html+=d.related[b].actions[h].id?this.attr(d.related[b].actions[h],"id"):"",html+=this.attr(d.related[b].actions[h],"ngClick"),html+=d.related[b].actions[h].awToolTip?this.attr(d.related[b].actions[h],"awToolTip"):
"",html+=d.related[b].actions[h].awToolTip?'data-placement="top" ':"",html+=d.related[b].actions[h].ngHide?this.attr(d.related[b].actions[h],"ngHide"):"",html+='><i class="'+d.related[b].actions[h].icon+'"></i>',html+=d.related[b].actions[h].label?" "+d.related[b].actions[h].label:"",html+="</button>\n";html+="</div>\n";html+='<div class="list">\n';html+='<table class="'+d.related[b].iterator+' table table-condensed table-hover">\n';html+="<thead>\n";html+="<tr>\n";html+="<th>#</th>\n";for(var k in d.related[b].fields)html+=
'<th class="list-header" id="'+d.related[b].iterator+"-"+k+'-header" ng-click="sort(\''+d.related[b].iterator+"', '"+k+"')\">"+d.related[b].fields[k].label,html+=' <i class="',html=d.related[b].fields[k].key?d.related[b].fields[k].desc?html+"icon-sort-down":html+"icon-sort-up":html+"icon-sort",html+='"></i></a></th>\n';html+="<th></th>\n";html+="</tr>\n";html+="</thead>";html+="<tbody>\n";html+='<tr ng-repeat="'+d.related[b].iterator+" in "+b+'" >\n';html+="<td>{{ $index + ("+d.related[b].iterator+
"Page * "+d.related[b].iterator+"PageSize) + 1 }}.</td>\n";var m=1,p=d.related[b].base?d.related[b].base:b,p=p.replace(/^\//,"");for(k in d.related[b].fields)m++,html+=e({list:d.related[b],fld:k,options:f,base:p});html+='<td class="actions">';for(h in d.related[b].fieldActions)html+='<button class="btn btn-mini',html+=d.related[b].fieldActions[h]["class"]?" "+d.related[b].fieldActions[h]["class"]:"",html+='" ',html+=d.related[b].fieldActions[h].awToolTip?this.attr(d.related[b].fieldActions[h],"awToolTip"):
"",html+=this.attr(d.related[b].fieldActions[h],"ngClick")+">"+this.icon(d.related[b].fieldActions[h].icon),html+=d.related[b].fieldActions[h].label?" "+d.related[b].fieldActions[h].label:"",html+="</button> ";html+="</td>";html+="</tr>\n";html+='<tr class="info" ng-show="'+d.related[b].iterator+"Loading == false && ("+b+" == null || "+b+'.length == 0)">\n';html+='<td colspan="'+m+'"><div class="alert alert-info">No records matched your search.</div></td>\n';html+="</tr>\n";html+='<tr class="info" ng-show="'+
d.related[b].iterator+'Loading == true">\n';html+='<td colspan="'+m+'"><div class="alert alert-info">Loading...</div></td>\n';html+="</tr>\n";html+="</tbody>\n";html+="</table>\n";html+="</div>\n";html+="</div>\n";html+=c({set:b,iterator:d.related[b].iterator,mini:!0})}a++}html+="</div>\n";return html+="</div>\n"},buildCollections:function(f){var a=1,d=this.form;html='<div id="'+this.form.name+"-collapse-"+a+'" class="jqui-accordion">\n';for(var b in d.related)if("collection"==d.related[b].type){html+=
"<h3>"+d.related[b].title+"<h3>\n";html+="<div>\n";d.related[b].instructions&&(html+='<div class="alert alert-info alert-block">\n',html+='<button type="button" class="close" data-dismiss="alert">&times;</button>\n',html+="<strong>Hint: </strong>"+d.related[b].instructions+"\n",html+="</div>\n");html+='<div class="well">\n';html+=g({iterator:d.related[b].iterator,template:d.related[b],mini:!1});html+='<div class="list-actions">\n';for(var h in d.related[b].actions){var k=d.related[b].actions[h];html+=
'<button class="btn btn-small btn-success" ';html+=this.attr(k,"ngClick");html+=k.awToolTip?this.attr(k,"awToolTip"):"";html+=k.awToolTip?'data-placement="right" ':"";html+='><i class="'+k.icon+'"></i>';html+=k.label?" "+k.label:"";html+="</button>\n"}html+="</div>\n";html+='<div class="list">\n';html+='<table class="'+d.related[b].iterator+' table table-condensed table-hover">\n';html+="<thead>\n";html+="<tr>\n";html+=void 0==d.related[b].index||!1!==d.related[b].index?"<th>#</th>\n":"";for(var m in d.related[b].fields)html+=
'<th class="list-header" id="'+d.related[b].iterator+"-"+m+'-header" ng-click="sort(\''+d.related[b].iterator+"', '"+m+"')\">"+d.related[b].fields[m].label,html+=' <i class="',html=d.related[b].fields[m].key?d.related[b].fields[m].desc?html+"icon-sort-down":html+"icon-sort-up":html+"icon-sort",html+='"></i></a></th>\n';html+="<th></th>\n";html+="</tr>\n";html+="</thead>";html+="<tbody>\n";html+='<tr ng-repeat="'+d.related[b].iterator+" in "+b+'" >\n';if(void 0==d.related[b].index||!1!==d.related[b].index)html+=
"<td>{{ $index + ("+d.related[b].iterator+"Page * "+d.related[b].iterator+"PageSize) + 1 }}.</td>\n";var p=1,k=d.related[b].base?d.related[b].base:b,k=k.replace(/^\//,"");for(m in d.related[b].fields)p++,html+=e({list:d.related[b],fld:m,options:f,base:k});html+='<td class="actions">';for(h in d.related[b].fieldActions)k=d.related[b].fieldActions[h],html+='<button class="btn btn-small',html+=k["class"]?" "+k["class"]:"",html+='" '+this.attr(k,"ngClick"),html+=k.awToolTip?this.attr(k,"awToolTip"):"",
html+=k.awToolTip?'data-placement="top" ':"",html+=">"+this.icon(k.icon),html+=k.label?" "+k.label:"",html+="</button> ";html+="</td>";html+="</tr>\n";html+='<tr class="info" ng-show="'+d.related[b].iterator+"Loading == false && ("+b+" == null || "+b+'.length == 0)">\n';html+='<td colspan="'+p+'"><div class="alert alert-info">No records matched your search.</div></td>\n';html+="</tr>\n";html+='<tr class="info" ng-show="'+d.related[b].iterator+'Loading == true">\n';html+='<td colspan="'+p+'"><div class="alert alert-info">Loading...</div></td>\n';
html+="</tr>\n";html+="</tbody>\n";html+="</table>\n";html+="</div>\n";html+="</div>\n";html+=c({set:b,iterator:d.related[b].iterator,mini:!0});html+="</div>\n";a++}html+="</div>\n";return html+="</div>\n"}}}]);angular.module("GeneratorHelpers",["GeneratorHelpers"]).factory("Attr",function(){return function(h,m){var k;k="string"===typeof h[m]?h[m].replace(/\'/g,"&quot;"):h[m];switch(m){case "ngClick":k='ng-click="'+k+'" ';break;case "ngOptions":k='ng-options="'+k+'" ';break;case "ngClass":k='ng-class="'+k+'" ';break;case "ngChange":k='ng-change="'+k+'" ';break;case "ngDisabled":k='ng-disabled="'+k+'" ';break;case "ngShow":k='ng-show="'+k+'" ';break;case "ngHide":k='ng-hide="'+k+'" ';break;case "ngBind":k=
html+='<div id="hosts-well" class="well">\n';html+='<h4 id="hosts-title">'+d.related[b].title+"</h4>\n";html+=g({iterator:d.related[b].iterator,template:d.related[b],mini:!0});html+='<div class="list-actions">\n';for(var h in d.related[b].actions)html+='<button class="btn btn-mini ',html+=d.related[b].actions[h]["class"]?d.related[b].actions[h]["class"]:"btn-success",html+='" ',html+=d.related[b].actions[h].id?this.attr(d.related[b].actions[h],"id"):"",html+=this.attr(d.related[b].actions[h],"ngClick"),
html+=d.related[b].actions[h].awToolTip?this.attr(d.related[b].actions[h],"awToolTip"):"",html+=d.related[b].actions[h].awToolTip?'data-placement="top" ':"",html+=d.related[b].actions[h].ngHide?this.attr(d.related[b].actions[h],"ngHide"):"",html+='><i class="'+d.related[b].actions[h].icon+'"></i>',html+=d.related[b].actions[h].label?" "+d.related[b].actions[h].label:"",html+="</button>\n";html+="</div>\n";html+='<div class="list">\n';html+='<table class="'+d.related[b].iterator+' table table-condensed table-hover">\n';
html+="<thead>\n";html+="<tr>\n";html+="<th>#</th>\n";for(var k in d.related[b].fields)html+='<th class="list-header" id="'+d.related[b].iterator+"-"+k+'-header" ng-click="sort(\''+d.related[b].iterator+"', '"+k+"')\">"+d.related[b].fields[k].label,html+=' <i class="',html=d.related[b].fields[k].key?d.related[b].fields[k].desc?html+"icon-sort-down":html+"icon-sort-up":html+"icon-sort",html+='"></i></a></th>\n';html+="<th></th>\n";html+="</tr>\n";html+="</thead>";html+="<tbody>\n";html+='<tr ng-repeat="'+
d.related[b].iterator+" in "+b+'" >\n';html+="<td>{{ $index + ("+d.related[b].iterator+"Page * "+d.related[b].iterator+"PageSize) + 1 }}.</td>\n";var m=1,p=d.related[b].base?d.related[b].base:b,p=p.replace(/^\//,"");for(k in d.related[b].fields)m++,html+=e({list:d.related[b],fld:k,options:f,base:p});html+='<td class="actions">';for(h in d.related[b].fieldActions)html+='<button class="btn btn-mini',html+=d.related[b].fieldActions[h]["class"]?" "+d.related[b].fieldActions[h]["class"]:"",html+='" ',
html+=d.related[b].fieldActions[h].awToolTip?this.attr(d.related[b].fieldActions[h],"awToolTip"):"",html+=this.attr(d.related[b].fieldActions[h],"ngClick")+">"+this.icon(d.related[b].fieldActions[h].icon),html+=d.related[b].fieldActions[h].label?" "+d.related[b].fieldActions[h].label:"",html+="</button> ";html+="</td>";html+="</tr>\n";html+='<tr class="info" ng-show="'+d.related[b].iterator+"Loading == false && ("+b+" == null || "+b+'.length == 0)">\n';html+='<td colspan="'+m+'"><div class="alert alert-info">No records matched your search.</div></td>\n';
html+="</tr>\n";html+='<tr class="info" ng-show="'+d.related[b].iterator+'Loading == true">\n';html+='<td colspan="'+m+'"><div class="alert alert-info">Loading...</div></td>\n';html+="</tr>\n";html+="</tbody>\n";html+="</table>\n";html+="</div>\n";html+="</div>\n";html+=c({set:b,iterator:d.related[b].iterator,mini:!0})}a++}html+="</div>\n";return html+="</div>\n"},buildCollections:function(f){var a=1,d=this.form;html='<div id="'+this.form.name+"-collapse-"+a+'" class="jqui-accordion">\n';for(var b in d.related)if("collection"==
d.related[b].type){html+="<h3>"+d.related[b].title+"<h3>\n";html+="<div>\n";d.related[b].instructions&&(html+='<div class="alert alert-info alert-block">\n',html+='<button type="button" class="close" data-dismiss="alert">&times;</button>\n',html+="<strong>Hint: </strong>"+d.related[b].instructions+"\n",html+="</div>\n");html+='<div class="well">\n';html+=g({iterator:d.related[b].iterator,template:d.related[b],mini:!0});html+='<div class="list-actions">\n';for(var h in d.related[b].actions){var k=
d.related[b].actions[h];html+='<button class="btn btn-small ';html+=d.related[b].actions[h]["class"]?d.related[b].actions[h]["class"]:"btn-success";html+='" ';html+=this.attr(k,"ngClick");html+=k.awToolTip?this.attr(k,"awToolTip"):"";html+=k.awToolTip?'data-placement="right" ':"";html+='><i class="'+k.icon+'"></i>';html+=k.label?" "+k.label:"";html+="</button>\n"}html+="</div>\n";html+='<div class="list">\n';html+='<table class="'+d.related[b].iterator+' table table-condensed table-hover">\n';html+=
"<thead>\n";html+="<tr>\n";html+=void 0==d.related[b].index||!1!==d.related[b].index?"<th>#</th>\n":"";for(var m in d.related[b].fields)html+='<th class="list-header" id="'+d.related[b].iterator+"-"+m+'-header" ng-click="sort(\''+d.related[b].iterator+"', '"+m+"')\">"+d.related[b].fields[m].label,html+=' <i class="',html=d.related[b].fields[m].key?d.related[b].fields[m].desc?html+"icon-sort-down":html+"icon-sort-up":html+"icon-sort",html+='"></i></a></th>\n';html+="<th></th>\n";html+="</tr>\n";html+=
"</thead>";html+="<tbody>\n";html+='<tr ng-repeat="'+d.related[b].iterator+" in "+b+'" >\n';if(void 0==d.related[b].index||!1!==d.related[b].index)html+="<td>{{ $index + ("+d.related[b].iterator+"Page * "+d.related[b].iterator+"PageSize) + 1 }}.</td>\n";var p=1,k=d.related[b].base?d.related[b].base:b,k=k.replace(/^\//,"");for(m in d.related[b].fields)p++,html+=e({list:d.related[b],fld:m,options:f,base:k});html+='<td class="actions">';for(h in d.related[b].fieldActions)k=d.related[b].fieldActions[h],
html+='<button class="btn btn-small',html+=k["class"]?" "+k["class"]:"",html+='" '+this.attr(k,"ngClick"),html+=k.awToolTip?this.attr(k,"awToolTip"):"",html+=k.awToolTip?'data-placement="top" ':"",html+=">"+this.icon(k.icon),html+=k.label?" "+k.label:"",html+="</button> ";html+="</td>";html+="</tr>\n";html+='<tr class="info" ng-show="'+d.related[b].iterator+"Loading == false && ("+b+" == null || "+b+'.length == 0)">\n';html+='<td colspan="'+p+'"><div class="alert alert-info">No records matched your search.</div></td>\n';
html+="</tr>\n";html+='<tr class="info" ng-show="'+d.related[b].iterator+'Loading == true">\n';html+='<td colspan="'+p+'"><div class="alert alert-info">Loading...</div></td>\n';html+="</tr>\n";html+="</tbody>\n";html+="</table>\n";html+="</div>\n";html+="</div>\n";html+=c({set:b,iterator:d.related[b].iterator,mini:!0});html+="</div>\n";a++}html+="</div>\n";return html+="</div>\n"}}}]);angular.module("GeneratorHelpers",["GeneratorHelpers"]).factory("Attr",function(){return function(h,m){var k;k="string"===typeof h[m]?h[m].replace(/\'/g,"&quot;"):h[m];switch(m){case "ngClick":k='ng-click="'+k+'" ';break;case "ngOptions":k='ng-options="'+k+'" ';break;case "ngClass":k='ng-class="'+k+'" ';break;case "ngChange":k='ng-change="'+k+'" ';break;case "ngDisabled":k='ng-disabled="'+k+'" ';break;case "ngShow":k='ng-show="'+k+'" ';break;case "ngHide":k='ng-hide="'+k+'" ';break;case "ngBind":k=
'ng-bind="'+k+'" ';break;case "trueValue":k='ng-true-value="'+k+'" ';break;case "falseValue":k='ng-false-value="'+k+'" ';break;case "awToolTip":k='aw-tool-tip="'+k+'" ';break;case "awPopOver":k="aw-pop-over='"+k+"' ";break;case "dataTitle":k='data-title="'+k+'" ';break;case "dataPlacement":k='data-placement="'+k+'" ';break;case "dataContainer":k='data-container="'+k+'" ';break;default:k=m+'="'+k+'" '}return k}}).factory("Icon",function(){return function(h){return'<i class="'+h+'"></i> '}}).factory("Column",
["Attr","Icon",function(h,m){return function(k){var g=k.list,c=k.fld,p=k.options;k=k.base;var f=g.fields[c],e;e="<td "+('<td class="'+c+"-column");e+=f["class"]?" "+f["class"]:"";e+='" ';e+=f.ngClass?h(f,"ngClass"):"";e+=">\n";e+=f.ngShow?"<span "+h(f,"ngShow")+">":"";g.hasChildren&&f.hasChildren&&(e+='<span style="padding-left: {{ '+g.iterator+'.spaces }}px"><a href="" ng-click="{{ '+g.iterator+'.ngclick }}"> <i class="{{ '+g.iterator+'.ngicon }}" ng-show="\'{{ '+g.iterator+".related.children }}' !== ''\" ></i></a> ");
if((f.key||f.link||f.linkTo||f.ngClick)&&"lookup"!=p.mode&&"select"!=p.mode)if(f.linkTo)e+='<a href="#'+f.linkTo+'">';else if(f.ngClick)e+='<a href=""'+h(f,"ngClick")+'">';else if(void 0==f.link||f.link)e+='<a href="#/'+k+"/{{"+g.iterator+'.id }}">';f.ngShowIcon?e+='<i ng-show="'+f.ngShowIcon+'" class="'+f.icon+'"></i> ':f.icon&&(e+=m(f.icon)+" ");if(void 0==f.showValue||!0==f.showValue)e=f.ngBind?e+("{{ "+f.ngBind+" }}"):e+("{{"+g.iterator+"."+c+"}}");f.text&&(e+=f.text);g.hasChildren&&f.hasChildren&&
@ -355,15 +355,15 @@ m+"','"+k+'\')" ng-disabled="'+k+"PrevUrl == null || "+k+'PrevUrl == undefined">
k+'\')" class="input-mini',c+=g?" field-mini-height":"",c+=' page-size">\n',c+='<option value="10" selected>10</option>\n',c+='<option value="20" selected>20</option>\n',c+='<option value="40">40</option>\n',c+='<option value="60">60</option>\n',c+='<option value="80">80</option>\n',c+="</select>\n");c+='<div class="page-number-small" ng-show="'+k+'PageCount > 0" ';c+=">Page: {{ "+k+"Page + 1 }} of {{ "+k+"PageCount }}</div>\n";c+="</form>\n";return c+="</div>\n"}});angular.module("ListGenerator",["GeneratorHelpers"]).factory("GenerateList",["$location","$compile","$rootScope","SearchWidget","PaginateWidget","Attr","Icon","Column",function(h,m,k,g,c,p,f,e){return{setList:function(c){this.list=c},attr:p,icon:f,has:function(c){return this.form[c]&&null!=this.form[c]&&void 0!=this.form[c]?!0:!1},hide:function(){$("#lookup-modal").modal("hide")},inject:function(c,a){var d="lookup"==a.mode?angular.element(document.getElementById("lookup-modal-body")):a.id?angular.element(document.getElementById(a.id)):
angular.element(document.getElementById("htmlTemplate"));this.setList(c);d.html(this.build(a));this.scope=d.scope();m(d)(this.scope);"lookup"==a.mode&&(this.scope.lookupHeader=a.hdr,$("#lookup-modal").modal());return this.scope},build:function(f){var a="",d=this.list;if("lookup"!=f.mode&&(void 0==f.breadCrumbs||!0==f.breadCrumbs))a+='<div class="nav-path">\n<ul class="breadcrumb">\n',a+='<li ng-repeat="crumb in breadcrumbs"><a href="{{ \'#\' + crumb.path }}">{{ crumb.title | capitalize }}</a> <span class="divider">/</span></li>\n',
a+='<li class="active">',a="select"==f.mode?a+d.selectTitle:a+d.editTitle,a+="</li>\n</ul>\n</div>\n";"select"==f.mode&&d.selectInstructions?(a+='<div class="alert alert-info alert-block">\n',a+='<button type="button" class="close" data-dismiss="alert">&times;</button>\n',a+="<strong>Hint: </strong>"+d.selectInstructions+"\n",a+="</div>\n"):"edit"==f.mode&&d.editInstructions&&(a+='<div class="alert alert-info alert-block">\n',a+='<button type="button" class="close" data-dismiss="alert">&times;</button>\n',
a+="<strong>Hint: </strong>"+d.editInstructions+"\n",a+="</div>\n");if("lookup"!=f.mode&&(void 0==d.well||"true"==d.well))a+='<div class="well">\n';a="lookup"==f.mode?a+g({iterator:d.iterator,template:d,mini:!0}):a+g({iterator:d.iterator,template:d,mini:!1});if("lookup"!=f.mode){var b=h.path().replace(/^\//,"").split("/")[0],a=a+'<div class="list-actions">\n';for(action in d.actions)if("all"==d.actions[action].mode||d.actions[action].mode==f.mode)if(void 0==d.actions[action].basePaths||d.actions[action].basePaths&&
-1<d.actions[action].basePaths.indexOf(b))a+="<button "+this.attr(d.actions[action],"ngClick")+'class="btn',a+=d.actions[action]["class"]?" "+d.actions[action]["class"]:" btn-small",a+='" ',a+=d.actions[action].ngHide?this.attr(d.actions[action],"ngHide"):"",a+=d.actions[action].awToolTip?this.attr(d.actions[action],"awToolTip"):"",a+=d.actions[action].awToolTip?'data-placement="top" ':"",a+=" >"+this.icon(d.actions[action].icon),a+=d.actions[action].label?" "+d.actions[action].label:"",a+="</button> ";
if("select"==f.mode&&(void 0==f.selectButton||!0==f.selectButton))a+=' <button class="btn btn-small btn-success" aw-tool-tip="Complete your selection" ng-click="finishSelection()"><i class="icon-ok"></i> Finished</button>\n';a+="</div>\n"}a+='<table class="table table-condensed';a+=d["class"]?" "+d["class"]:"";a+="lookup"==f.mode||d.hover?" table-hover":"";a+='">\n';a+="<thead>\n";a+="<tr>\n";d.index&&(a+="<th>#</th>\n");for(var k in d.fields)if((void 0==d.fields[k].searchOnly||!1==d.fields[k].searchOnly)&&
!("lookup"==f.mode&&void 0!==d.fields[k].excludeModal&&!0==d.fields[k].excludeModal)){a+='<th class="list-header" id="';a+=d.fields[k].id?d.fields[k].id:k+"-header";a+='"';a+=void 0===d.fields[k].nosort||!0!==d.fields[k].nosort?"ng-click=\"sort('"+k+"')\"":"";a+=">"+d.fields[k].label;if(void 0===d.fields[k].nosort||!0!==d.fields[k].nosort)a+=' <i class="',a=d.fields[k].key?d.fields[k].desc?a+"icon-sort-down":a+"icon-sort-up":a+"icon-sort",a+='"></i></a>';a+="</th>\n"}"select"==f.mode?a+="<th>Select</th>":
"edit"==f.mode&&(a+="<th></th>\n");a+="</tr>\n";a+="</thead>\n";a+="<tbody>\n";a+="<tr ";a+="lookup"==f.mode||"select"==f.mode?'ng-class="'+d.iterator+"_{{ "+d.iterator+'.id }}_class" ':"";a+='class="'+d.iterator+'_class" ng-repeat="'+d.iterator+" in "+d.name;a+=d.orderBy?" | orderBy:'"+d.orderBy+"'":"";a+=d.filterBy?" | filter: "+d.filterBy:"";a+='"';a+="lookup"==f.mode||"select"==f.mode?' ng-click="toggle_'+d.iterator+"({{ "+d.iterator+'.id }})"':"";a+=">\n";d.index&&(a+='<td class="index-column">{{ $index + ('+
d.iterator+"Page * "+d.iterator+"PageSize) + 1 }}.</td>\n");var m=2,b=d.base?d.base:d.name,b=b.replace(/^\//,"");for(k in d.fields)if(m++,(void 0==d.fields[k].searchOnly||!1==d.fields[k].searchOnly)&&!("lookup"==f.mode&&void 0!==d.fields[k].excludeModal&&!0==d.fields[k].excludeModal))a+=e({list:d,fld:k,options:f,base:b});if("select"==f.mode)a+='<td><input type="checkbox" name="check_{{'+d.iterator+'.id}}" id="check_{{'+d.iterator+'.id}}" /></td>';else if("edit"==f.mode){a+='<td class="actions">';
for(action in d.fieldActions)a+='<button class="btn',a+=d.fieldActions[action]["class"]?" "+d.fieldActions[action]["class"]:" btn-small",a+='" '+this.attr(d.fieldActions[action],"ngClick"),a+=d.fieldActions[action].ngShow?this.attr(d.fieldActions[action],"ngShow"):"",a+=d.fieldActions[action].awToolTip?this.attr(d.fieldActions[action],"awToolTip"):"",a+=d.fieldActions[action].ngDisabled?this.attr(d.fieldActions[action],"ngDisabled"):"",a+=">",a+=d.fieldActions[action].icon?this.icon(d.fieldActions[action].icon):
"",a+=d.fieldActions[action].label?" "+d.fieldActions[action].label:"",a+="</button> ";a+="</td>"}a+="</tr>\n";a+='<tr class="info" ng-show="'+d.iterator+"Loading == false && ("+d.name+" == null || "+d.name+'.length == 0)">\n';a+='<td colspan="'+m+'"><div class="alert alert-info">No records matched your search.</div></td>\n';a+="</tr>\n";a+='<tr class="info" ng-show="'+d.iterator+'Loading == true">\n';a+='<td colspan="'+m+'"><div class="alert alert-info">Loading...</div></td>\n';a+="</tr>\n";a+="</tbody>\n";
a+="</table>\n";if("lookup"!=f.mode&&(void 0==d.well||"true"==d.well))a+="</div>\n";return a="lookup"==f.mode||f.id&&"form-modal-body"==f.id?a+c({set:d.name,iterator:d.iterator,mini:!0,mode:"lookup"}):a+c({set:d.name,iterator:d.iterator,mini:!0})}}}]);angular.module("PromptDialog",["Utilities"]).factory("Prompt",["Alert",function(h){return function(h){var k=angular.element(document.getElementById("prompt-modal")),g=k.scope();g.promptHeader=h.hdr;g.promptBody=h.body;var c=null==h["class"]||void 0==h["class"]?"btn-danger":h["class"];$("#prompt-action-btn").addClass(c);g.promptAction=h.action;$(k).modal({backdrop:"static",keyboard:!0,show:!0})}}]);angular.module("RestServices",["ngCookies","AuthService"]).factory("Rest",["$http","$rootScope","$cookieStore","Authorization",function(h,m,k,g){return{setUrl:function(c){this.url=c},auth:{Authorization:"Token "+g.getToken()},pReplace:function(){var c,g;for(c in this.params)g=RegExp("\\:"+c,"gm"),g.test(this.url)&&(this.url=this.url.replace(g,this.params[c]),delete this.params[c])},get:function(c){c=c?c:{};this.params=c.params?c.params:null;this.pReplace();return h({method:"GET",url:this.url,headers:this.auth,
a+="<strong>Hint: </strong>"+d.editInstructions+"\n",a+="</div>\n");if("lookup"!=f.mode&&(void 0==d.well||"true"==d.well))a+='<div class="well">\n';a="lookup"==f.mode||void 0!=f.id?a+g({iterator:d.iterator,template:d,mini:!0}):a+g({iterator:d.iterator,template:d,mini:!1});if("lookup"!=f.mode){var b=h.path().replace(/^\//,"").split("/")[0],a=a+'<div class="list-actions">\n';for(action in d.actions)if("all"==d.actions[action].mode||d.actions[action].mode==f.mode)if(void 0==d.actions[action].basePaths||
d.actions[action].basePaths&&-1<d.actions[action].basePaths.indexOf(b))a+="<button "+this.attr(d.actions[action],"ngClick")+'class="btn',a+=d.actions[action]["class"]?" "+d.actions[action]["class"]:" btn-small",a+='" ',a+=d.actions[action].ngHide?this.attr(d.actions[action],"ngHide"):"",a+=d.actions[action].awToolTip?this.attr(d.actions[action],"awToolTip"):"",a+=d.actions[action].awToolTip?'data-placement="top" ':"",a+=" >"+this.icon(d.actions[action].icon),a+=d.actions[action].label?" "+d.actions[action].label:
"",a+="</button> ";if("select"==f.mode&&(void 0==f.selectButton||!0==f.selectButton))a+=' <button class="btn btn-small btn-success" aw-tool-tip="Complete your selection" ng-click="finishSelection()"><i class="icon-ok"></i> Finished</button>\n';a+="</div>\n"}a+='<table class="table table-condensed';a+=d["class"]?" "+d["class"]:"";a+="lookup"==f.mode||d.hover?" table-hover":"";a+='">\n';a+="<thead>\n";a+="<tr>\n";d.index&&(a+="<th>#</th>\n");for(var k in d.fields)if((void 0==d.fields[k].searchOnly||
!1==d.fields[k].searchOnly)&&!("lookup"==f.mode&&void 0!==d.fields[k].excludeModal&&!0==d.fields[k].excludeModal)){a+='<th class="list-header" id="';a+=d.fields[k].id?d.fields[k].id:k+"-header";a+='"';a+=void 0===d.fields[k].nosort||!0!==d.fields[k].nosort?"ng-click=\"sort('"+k+"')\"":"";a+=">"+d.fields[k].label;if(void 0===d.fields[k].nosort||!0!==d.fields[k].nosort)a+=' <i class="',a=d.fields[k].key?d.fields[k].desc?a+"icon-sort-down":a+"icon-sort-up":a+"icon-sort",a+='"></i></a>';a+="</th>\n"}"select"==
f.mode?a+="<th>Select</th>":"edit"==f.mode&&(a+="<th></th>\n");a+="</tr>\n";a+="</thead>\n";a+="<tbody>\n";a+="<tr ";a+="lookup"==f.mode||"select"==f.mode?'ng-class="'+d.iterator+"_{{ "+d.iterator+'.id }}_class" ':"";a+='class="'+d.iterator+'_class" ng-repeat="'+d.iterator+" in "+d.name;a+=d.orderBy?" | orderBy:'"+d.orderBy+"'":"";a+=d.filterBy?" | filter: "+d.filterBy:"";a+='"';a+="lookup"==f.mode||"select"==f.mode?' ng-click="toggle_'+d.iterator+"({{ "+d.iterator+'.id }})"':"";a+=">\n";d.index&&
(a+='<td class="index-column">{{ $index + ('+d.iterator+"Page * "+d.iterator+"PageSize) + 1 }}.</td>\n");var m=2,b=d.base?d.base:d.name,b=b.replace(/^\//,"");for(k in d.fields)if(m++,(void 0==d.fields[k].searchOnly||!1==d.fields[k].searchOnly)&&!("lookup"==f.mode&&void 0!==d.fields[k].excludeModal&&!0==d.fields[k].excludeModal))a+=e({list:d,fld:k,options:f,base:b});if("select"==f.mode)a+='<td><input type="checkbox" name="check_{{'+d.iterator+'.id}}" id="check_{{'+d.iterator+'.id}}" /></td>';else if("edit"==
f.mode){a+='<td class="actions">';for(action in d.fieldActions)a+='<button class="btn',a+=d.fieldActions[action]["class"]?" "+d.fieldActions[action]["class"]:" btn-small",a+='" '+this.attr(d.fieldActions[action],"ngClick"),a+=d.fieldActions[action].ngShow?this.attr(d.fieldActions[action],"ngShow"):"",a+=d.fieldActions[action].awToolTip?this.attr(d.fieldActions[action],"awToolTip"):"",a+=d.fieldActions[action].ngDisabled?this.attr(d.fieldActions[action],"ngDisabled"):"",a+=">",a+=d.fieldActions[action].icon?
this.icon(d.fieldActions[action].icon):"",a+=d.fieldActions[action].label?" "+d.fieldActions[action].label:"",a+="</button> ";a+="</td>"}a+="</tr>\n";a+='<tr class="info" ng-show="'+d.iterator+"Loading == false && ("+d.name+" == null || "+d.name+'.length == 0)">\n';a+='<td colspan="'+m+'"><div class="alert alert-info">No records matched your search.</div></td>\n';a+="</tr>\n";a+='<tr class="info" ng-show="'+d.iterator+'Loading == true">\n';a+='<td colspan="'+m+'"><div class="alert alert-info">Loading...</div></td>\n';
a+="</tr>\n";a+="</tbody>\n";a+="</table>\n";if("lookup"!=f.mode&&(void 0==d.well||"true"==d.well))a+="</div>\n";return a="lookup"==f.mode||f.id&&"form-modal-body"==f.id?a+c({set:d.name,iterator:d.iterator,mini:!0,mode:"lookup"}):a+c({set:d.name,iterator:d.iterator,mini:!0})}}}]);angular.module("PromptDialog",["Utilities"]).factory("Prompt",["Alert",function(h){return function(h){var k=angular.element(document.getElementById("prompt-modal")),g=k.scope();g.promptHeader=h.hdr;g.promptBody=h.body;var c=null==h["class"]||void 0==h["class"]?"btn-danger":h["class"];$("#prompt-action-btn").addClass(c);g.promptAction=h.action;$(k).modal({backdrop:"static",keyboard:!0,show:!0})}}]);angular.module("RestServices",["ngCookies","AuthService"]).factory("Rest",["$http","$rootScope","$cookieStore","Authorization",function(h,m,k,g){return{setUrl:function(c){this.url=c},auth:{Authorization:"Token "+g.getToken()},pReplace:function(){var c,g;for(c in this.params)g=RegExp("\\:"+c,"gm"),g.test(this.url)&&(this.url=this.url.replace(g,this.params[c]),delete this.params[c])},get:function(c){c=c?c:{};this.params=c.params?c.params:null;this.pReplace();return h({method:"GET",url:this.url,headers:this.auth,
params:this.params})},post:function(c){return h({method:"POST",url:this.url,headers:this.auth,data:c})},put:function(c){return h({method:"PUT",url:this.url,headers:this.auth,data:c})},destroy:function(c){return h({method:"DELETE",url:this.url,headers:this.auth,data:c})}}}]);angular.module("Utilities",[]).factory("ClearScope",function(){return function(h){h=document.getElementById(h);angular.element(h).scope().$destroy()}}).factory("ToggleClass",function(){return function(h,m){$(h)&&$(h).hasClass(m)?$(h).removeClass(m):$(h)&&$(h).addClass(m)}}).factory("Alert",["$rootScope","$location",function(h,m){return function(k,g,c,m,f,e){if(f){if(h.alertHeader2=k,h.alertBody2=g,h.alertClass2=c?c:"alert-error",$("#alert-modal2").modal({show:!0,keyboard:!0,backdrop:"static"}),h.disableButtons2=
e?!0:!1,m)$("#alert-modal2").on("hidden",function(){m()})}else if(h.alertHeader=k,h.alertBody=g,h.alertClass=c?c:"alert-error",$("#alert-modal").modal({show:!0,keyboard:!0,backdrop:"static"}),h.disableButtons=e?!0:!1,m)$("#alert-modal").on("hidden",function(){m()})}}]).factory("ProcessErrors",["$log","Alert",function(h,m){return function(h,g,c,p,f){if(403==c)h="The API responded with a 403 Access Denied error. You do not have permission to perform the requested action. ",h=g.detail?h+("Detail: "+
g.detail):h+"Please contact your system administrator.",m("Access Denied",h);else if(g.non_field_errors)m("Error!",g.non_field_errors);else if(g.detail)m(f.hdr,f.msg+" "+g.detail);else if(g.__all__)m("Error!",g.__all__);else if(p){c=!1;for(var e in p.fields)p.fields[e].realName&&g[p.fields[e].realName]&&(h[e+"_api_error"]=g[p.fields[e]][0],c=!0),p.fields[e].sourceModel?g[e]&&(h[p.fields[e].sourceModel+"_"+p.fields[e].sourceField+"_api_error"]=g[e][0],c=!0):g[e]&&(h[e+"_api_error"]=g[e][0],c=!0);!c&&

View File

@ -13,8 +13,8 @@ var $AnsibleConfig =
session_timeout: 3600, // cookie expiration in seconds. session will expire after this many
// seconds of inactivity.
tooltip_delay: 2000, // Default number of milliseconds to delay displaying/hiding tooltips
tooltip_delay: {show: 500, hide: 100}, // Default number of milliseconds to delay displaying/hiding tooltips
debug_mode: true // Enable console logging messages
debug_mode: true // Enable console logging messages
}

View File

@ -502,10 +502,14 @@ function InventoriesEdit ($scope, $rootScope, $compile, $location, $log, $routeP
GroupsDelete({ scope: scope, "inventory_id": id, group_id: scope.group_id });
}
scope.addHost = function() {
scope.selectHost = function() {
HostsList({ scope: scope, "inventory_id": id, group_id: scope.group_id });
}
scope.createHost = function() {
HostsAdd({ scope: scope, "inventory_id": id, group_id: scope.group_id });
}
scope.editHost = function(host_id, host_name) {
HostsEdit({ scope: scope, "inventory_id": id, group_id: scope.group_id, host_id: host_id, host_name: host_name });
}

View File

@ -415,7 +415,6 @@ function JobTemplatesEdit ($scope, $rootScope, $compile, $location, $log, $route
else {
var json_obj = JSON.parse(data.extra_vars);
scope.variables = jsyaml.safeDump(json_obj);
console.log(json_obj);
}
master.variables = scope.variables;
}

View File

@ -102,13 +102,22 @@ angular.module('InventoryFormDefinition', [])
type: 'treeview',
title: "{{ groupTitle }}",
iterator: 'host',
actions: {
add: {
ngClick: "addHost()",
actions: {
select: {
ngClick: "selectHost()",
icon: 'icon-check',
label: 'Add Existing Host',
awToolTip: 'Select existing host',
ngHide: 'createButtonShow == false',
"class": 'btn btn-pad'
},
create: {
ngClick: "createHost()",
icon: 'icon-plus',
label: 'Add Host',
awToolTip: 'Add a host',
ngHide: 'createButtonShow == false'
label: 'Create New Host',
awToolTip: 'Create a new host',
ngHide: 'createButtonShow == false',
"class": 'btn-success'
}
},

View File

@ -1,7 +1,7 @@
/*********************************************
* Copyright (c) 2013 AnsibleWorks, Inc.
*
*/
*/
angular.module('AccessHelper', ['RestServices', 'Utilities', 'ngCookies'])
.factory('CheckAccess', ['$rootScope', 'Alert', 'Rest', 'GetBasePath','ProcessErrors',

View File

@ -32,8 +32,8 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', '
selectButton: false
});
scope.formModalActionLabel = 'Finished';
scope.formModalHeader = 'Add Group';
scope.formModalActionLabel = 'Select';
scope.formModalHeader = 'Add Groups';
scope.formModalCancelShow = true;
scope.formModalActionClass = 'btn btn-success';
@ -409,7 +409,6 @@ angular.module('GroupsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', '
//if (parent.length > 0) {
// parent = parent.last();
//}
console.log(parent);
var url;
if (parent.attr('type') == 'group') {

View File

@ -33,14 +33,21 @@ angular.module('HostsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', 'H
selectButton: false
});
scope.formModalActionLabel = 'Finished';
scope.formModalHeader = 'Add Host';
scope.formModalActionLabel = 'Select';
scope.formModalHeader = 'Select Hosts';
scope.formModalCancelShow = true;
if (scope.removeHostsReload) {
scope.removeHostsReload();
}
scope.removeHostsReload = scope.$on('hostsReload', function() {
HostsReload(params);
});
$('#form-modal .btn-none').removeClass('btn-none').addClass('btn-success');
$('#form-modal').modal();
$('#form-modal').unbind('hidden');
$('#form-modal').on('hidden', function () { HostsReload(params); });
$('#form-modal').on('hidden', function () { scope.$emit('hostsReload'); });
scope.selected = [];
@ -89,7 +96,7 @@ angular.module('HostsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', 'H
}
else {
$('#form-modal').modal('hide');
HostsReload(params);
scope.$emit('hostsReload');
}
}
});
@ -168,9 +175,16 @@ angular.module('HostsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', 'H
scope.parseType = 'yaml';
ParseTypeChange(scope);
if (scope.removeHostsReload) {
scope.removeHostsReload();
}
scope.removeHostsReload = scope.$on('hostsReload', function() {
HostsReload(params);
});
$('#form-modal .btn-none').removeClass('btn-none').addClass('btn-success');
$('#form-modal').unbind('hidden');
$('#form-modal').on('hidden', function () { HostsReload(params); });
$('#form-modal').on('hidden', function () { scope.$emit('hostsReload'); });
generator.reset();
var master={};
@ -260,10 +274,17 @@ angular.module('HostsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', 'H
scope.formModalCancelShow = true;
scope.parseType = 'yaml';
ParseTypeChange(scope);
if (scope.removeHostsReload) {
scope.removeHostsReload();
}
scope.removeHostsReload = scope.$on('hostsReload', function() {
HostsReload(params);
});
$('#form-modal .btn-none').removeClass('btn-none').addClass('btn-success');
$('#form-modal').unbind('hidden');
$('#form-modal').on('hidden', function () { HostsReload(params); });
$('#form-modal').on('hidden', function () { scope.$emit('hostsReload'); });
// After the group record is loaded, retrieve any group variables
if (scope.hostLoadedRemove) {
@ -395,15 +416,21 @@ angular.module('HostsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', 'H
var url = (group_id !== null) ? GetBasePath('groups') + group_id + '/hosts/' : GetBasePath('inventory') + inventory_id + '/hosts/';
var action_to_take = function() {
if (scope.removeHostsReload) {
scope.removeHostsReload();
}
scope.removeHostsReload = scope.$on('hostsReload', function() {
HostsReload(params);
});
Rest.setUrl(url);
Rest.post({ id: host_id, disassociate: 1 })
.success( function(data, status, headers, config) {
$('#prompt-modal').modal('hide');
HostsReload(params);
scope.$emit('hostsReload');
})
.error( function(data, status, headers, config) {
$('#prompt-modal').modal('hide');
HostsReload(params);
scope.$emit('hostsReload');
ProcessErrors(scope, data, status, null,
{ hdr: 'Error!', msg: 'Call to ' + url + ' failed. DELETE returned status: ' + status });
});
@ -427,13 +454,14 @@ angular.module('HostsHelper', [ 'RestServices', 'Utilities', 'ListGenerator', 'H
function(RelatedSearchInit, RelatedPaginateInit, InventoryForm, GetBasePath) {
return function(params) {
// Rerfresh the Hosts view on right side of page
var url = (params.group_id !== null) ? GetBasePath('groups') + params.group_id + '/hosts/' :
GetBasePath('inventory') + params.inventory_id + '/hosts/';
scope = params.scope;
var url = (scope.group_id !== null) ? GetBasePath('groups') + scope.group_id + '/hosts/' :
GetBasePath('inventory') + params.inventory_id + '/hosts/';
var relatedSets = { hosts: { url: url, iterator: 'host' } };
RelatedSearchInit({ scope: params.scope, form: InventoryForm, relatedSets: relatedSets });
RelatedPaginateInit({ scope: params.scope, relatedSets: relatedSets });
params.scope.search('host');
if (!params.scope.$$phase) {
if (!params.scope.$$phase) {
params.scope.$digest();
}
}

View File

@ -43,8 +43,6 @@ angular.module('TeamHelper', [ 'RestServices', 'Utilities', 'OrganizationListDef
Rest.setUrl('/api/v1/organizations/' + results[i].organization + '/');
Rest.get()
.success( function( data, status, headers, config) {
console.log('here!');
console.log(data);
lookup_results.push({ id: data.id, value: data.name });
scope.$emit('TeamResultFound', results, lookup_results);
})

View File

@ -14,7 +14,6 @@ angular.module('GroupListDefinition', [])
iterator: 'group',
selectTitle: 'Add Group',
editTitle: 'Groups',
selectInstructions: 'Click on a row to select it, and Finished when done. Click the green <i class=\"icon-plus\"></i> Add to create a new row.',
index: true,
well: false,
@ -30,7 +29,7 @@ angular.module('GroupListDefinition', [])
actions: {
add: {
label: 'Add',
label: 'Create New Group',
icon: 'icon-plus',
mode: 'all', // One of: edit, select, all
ngClick: 'createGroup()',

View File

@ -12,8 +12,7 @@ angular.module('HostListDefinition', [])
name: 'hosts',
iterator: 'host',
selectTitle: 'Add Host',
selectInstructions: 'Click on a row to select it, and click Finished when done. Use the green <i class=\"icon-plus\"></i> button to create a new row.',
selectTitle: 'Select Host',
editTitle: 'Hosts',
index: true,
well: true,
@ -21,7 +20,7 @@ angular.module('HostListDefinition', [])
fields: {
name: {
key: true,
label: 'Name',
label: 'Host Name',
linkTo: "/inventories/\{\{ inventory_id \}\}/hosts/\{\{ host.id \}\}"
},
description: {
@ -30,15 +29,6 @@ angular.module('HostListDefinition', [])
},
actions: {
add: {
icon: 'icon-plus',
label: 'Add',
mode: 'all', // One of: edit, select, all
ngClick: 'createHost()',
ngHide: 'showAddButton == false',
"class": 'btn-success btn-small',
awToolTip: 'Create a new host'
}
},
fieldActions: {

View File

@ -54,7 +54,7 @@ angular.module('InventoriesListDefinition', [])
mode: 'all', // One of: edit, select, all
ngClick: 'addInventory()',
"class": 'btn-small btn-success',
awToolTip: 'Create a new row'
awToolTip: 'Create a new inventory'
}
},

View File

@ -34,7 +34,7 @@ angular.module('OrganizationListDefinition', [])
mode: 'all', // One of: edit, select, all
ngClick: 'addOrganization()',
"class": 'btn-success btn-small',
awToolTip: 'Create a new row'
awToolTip: 'Create a new organization'
}
},

View File

@ -808,7 +808,9 @@ angular.module('FormGenerator', ['GeneratorHelpers', 'ngCookies'])
// Add actions(s)
html += "<div class=\"list-actions\">\n";
for (var action in form.related[itm].actions) {
html += "<button class=\"btn btn-mini btn-success\" ";
html += "<button class=\"btn btn-mini ";
html += (form.related[itm].actions[action]['class']) ? form.related[itm].actions[action]['class'] : "btn-success";
html += "\" ";
html += (form.related[itm]['actions'][action].id) ? this.attr(form.related[itm]['actions'][action],'id') : "";
html += this.attr(form.related[itm]['actions'][action],'ngClick');
html += (form.related[itm]['actions'][action].awToolTip) ? this.attr(form.related[itm]['actions'][action],'awToolTip') : "";
@ -943,13 +945,15 @@ angular.module('FormGenerator', ['GeneratorHelpers', 'ngCookies'])
}
html += "<div class=\"well\">\n";
html += SearchWidget({ iterator: form.related[itm].iterator, template: form.related[itm], mini: false });
html += SearchWidget({ iterator: form.related[itm].iterator, template: form.related[itm], mini: true });
// Add actions(s)
html += "<div class=\"list-actions\">\n";
for (var act in form.related[itm].actions) {
var action = form.related[itm].actions[act];
html += "<button class=\"btn btn-small btn-success\" ";
html += "<button class=\"btn btn-small ";
html += (form.related[itm].actions[act]['class']) ? form.related[itm].actions[act]['class'] : "btn-success";
html += "\" ";
html += this.attr(action,'ngClick');
html += (action.awToolTip) ? this.attr(action,'awToolTip') : "";
html += (action.awToolTip) ? "data-placement=\"right\" " : "";

View File

@ -108,7 +108,7 @@ angular.module('ListGenerator', ['GeneratorHelpers'])
html += "<div class=\"well\">\n";
}
if (options.mode == 'lookup') {
if (options.mode == 'lookup' || options.id != undefined) {
html += SearchWidget({ iterator: list.iterator, template: list, mini: true });
}
else {

View File

@ -171,7 +171,7 @@
<div class="modal-body" id="lookup-modal-body"></div>
<div class="modal-footer">
<a href="#" data-target="#lookup-modal" data-dismiss="modal" class="btn">Cancel</a>
<a href="" ng-click="selectAction()" class="btn btn-success">Select</a>
<a href="" ng-click="selectAction()" class="btn btn-primary">Select</a>
</div>
</div>
@ -185,7 +185,7 @@
<div class="modal-body" id="form-modal-body"></div>
<div class="modal-footer">
<a href="#" ng-show="formModalCancelShow" data-target="#form-modal" data-dismiss="modal" class="btn btn">Cancel</a>
<a href="" ng-bind="formModalActionLabel" ng-click="formModalAction()" class="btn btn-success"></a>
<a href="" ng-bind="formModalActionLabel" ng-click="formModalAction()" class="btn btn-primary"></a>
</div>
</div>

Binary file not shown.