|
|
|
|
@@ -4,7 +4,7 @@
|
|
|
|
|
*
|
|
|
|
|
* awx-min.js
|
|
|
|
|
*
|
|
|
|
|
* master-8f00625, Mon Jul 15 14:32:08 2013 -0400
|
|
|
|
|
* master-6fcbfb1, Mon Jul 15 14:35:54 2013 -0400
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
var urlPrefix="/static/";
|
|
|
|
|
@@ -64,8 +64,8 @@ b,c,e){d(u,a,b,f,{hdr:"Error!",msg:"Failed to retrieve event detail: "+p.event_i
|
|
|
|
|
y({scope:t,list:e,url:k});t.search(e.iterator);a();t.showEvents=function(b,d){p.setUrl(d);p.get().success(function(d,c,f,e){a({path:"/jobs/"+d.id,title:d.name});h.url("/jobs/"+d.id+"/job_events/?host="+escape(b))}).error(function(a,b,c,f){u(t,a,b,form,{hdr:"Error!",msg:"Failed to lookup last job: "+d+". GET status: "+b})})};t.refresh=function(){t.search(e.iterator)};t.jobDetails=function(){h.path("/jobs/"+c.id)};t.jobEvents=function(){h.path("/jobs/"+c.id+"/job_events")}}
|
|
|
|
|
JobHostSummaryList.$inject="$scope $rootScope $location $log $routeParams Rest Alert JobHostList GenerateList LoadBreadCrumbs Prompt SearchInit PaginateInit ReturnToCaller ClearScope ProcessErrors GetBasePath".split(" ");function JobsListCtrl(k,m,h,g,c,p,f,e,l,a,d,b,y,v,A,u,C,t,s,n){A("htmlTemplate");var B=C("jobs");h.path().replace(/^\//,"").split("/");var q=l.inject(e,{mode:"edit"});m.flashMessage=null;q.selected=[];q.PostRefreshRemove&&q.PostRefreshRemove();q.PostRefreshRemove=q.$on("PostRefresh",function(){$("tr.success").each(function(a){a=$(this).attr("ng-class");q[a]=""});for(var a,b=0;b<q[e.name].length;b++)a=new Date(q[e.name][b].created),q[e.name][b].created=n(a)});b({scope:q,set:"jobs",list:e,url:B});y({scope:q,
|
|
|
|
|
list:e,url:B});c.inventory__int&&(q[e.iterator+"SearchField"]="inventory",q[e.iterator+"SearchValue"]=c.inventory__int,q[e.iterator+"SearchFieldLabel"]="Inventory ID");q.search(e.iterator);a();q.refreshJob=function(){q.search(e.iterator)};q.editJob=function(b,d){a({path:"/jobs/"+b,title:d});h.path(h.path()+"/"+b)};q.viewEvents=function(b,d){a({path:"/jobs/"+b,title:d});h.path(h.path()+"/"+b+"/job_events")};q.viewSummary=function(b,d){a({path:"/jobs/"+b,title:d});h.path(h.path()+"/"+b+"/job_host_summaries")};
|
|
|
|
|
q.deleteJob=function(a,b){p.setUrl(B+a+"/");p.get().success(function(b,c,f,l){var n,g;"pending"==b.status||"running"==b.status?(n=b.related.cancel,g="cancel",b="Cancel Job"):(n=B+a+"/",g="delete",b="Delete Job");d({hdr:b,body:"Are you sure you want to "+g+" job "+a+"?",action:function(){p.setUrl(n);"cancel"==g?p.post().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. 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(" ");
|
|
|
|
|
q.deleteJob=function(a,b){p.setUrl(B+a+"/");p.get().success(function(b,c,f,n){var l,g;"pending"==b.status||"running"==b.status?(l=b.related.cancel,g="cancel",b="Cancel Job"):(l=B+a+"/",g="delete",b="Delete Job");d({hdr:b,body:"Are you sure you want to "+g+" job "+a+"?",action:function(){p.setUrl(l);"cancel"==g?p.post().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 "+
|
|
|
|
|
l+" 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 "+l+" 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(k,m,h,g,c,p,f,e,l,a,d,b,y,v,A,u,C,t,s,n,B,q,w,z){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={},J=p.id,H={};r.parseType="yaml";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;w({scope:r,master:G,check_field:"allow_callbacks",default_val:b});r.callback_url=a.related.callback;$('input[type="checkbox"]').attr("disabled","disabled");$('input[type="radio"]').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: "+
|
|
|
|
|
@@ -126,8 +126,8 @@ function TeamsAdd(k,m,h,g,c,p,f,e,l,a,d,b,y,v,A,u,C,t,s,n){v("htmlTemplate");var
|
|
|
|
|
TeamsAdd.$inject="$scope $rootScope $compile $location $log $routeParams TeamForm GenerateForm Rest Alert ProcessErrors LoadBreadCrumbs ReturnToCaller ClearScope GenerateList OrganizationList SearchInit PaginateInit TeamLookUpOrganizationInit GetBasePath".split(" ");
|
|
|
|
|
function TeamsEdit(k,m,h,g,c,p,f,e,l,a,d,b,y,v,A,u,C,t,s,n){u("htmlTemplate");var B=s("teams"),q=e.inject(f,{mode:"edit",related:!0});e.reset();var w=g.path().replace(/^\//,"").split("/")[0],z={},E=p.team_id,F={};C({scope:q});q.teamLoadedRemove&&q.teamLoadedRemove();q.teamLoadedRemove=q.$on("teamLoaded",function(){l.setUrl(q.organization_url);l.get().success(function(a,b,d,c){q.organization_name=a.name;z.organization_name=a.name}).error(function(a,b,c,e){d(q,a,b,null,{hdr:"Error!",msg:"Failed to retrieve: "+
|
|
|
|
|
q.orgnization_url+". GET status: "+b})});for(var a in F)q.search(F[a].iterator)});l.setUrl(B+":id/");l.get({params:{id:E}}).success(function(a,d,c,e){b({path:"/teams/"+E,title:a.name});for(var l in f.fields)a[l]&&(q[l]=a[l],z[l]=q[l]);d=a.related;for(var n in f.related)d[n]&&(F[n]={url:d[n],iterator:f.related[n].iterator});y({scope:q,form:f,relatedSets:F});v({scope:q,relatedSets:F});q.organization_url=a.related.organization;q.$emit("teamLoaded")}).error(function(a,b,c,e){d(q,a,b,f,{hdr:"Error!",msg:"Failed to retrieve team: "+
|
|
|
|
|
p.id+". GET status: "+b})});q.formSave=function(){m.flashMessage=null;l.setUrl(B+p.id+"/");var a={},b;for(b in f.fields)a[b]=q[b];l.put(a).success(function(a,b,d,c){"teams"==g.path().replace(/^\//,"").split("/")[0]?A():A(1)}).error(function(a,b,c,e){d(q,a,b,f,{hdr:"Error!",msg:"Failed to update team: "+p.id+". PUT status: "+b})})};q.formReset=function(){m.flashMessage=null;e.reset();for(var a in z)q[a]=z[a]};q.add=function(a){m.flashMessage=null;"permissions"==a?n()&&g.path("/"+w+"/"+p.team_id+"/"+
|
|
|
|
|
a+"/add"):g.path("/"+w+"/"+p.team_id+"/"+a)};q.edit=function(a,b,d){m.flashMessage=null;"permissions"==a?n()&&g.path("/"+w+"/"+p.team_id+"/"+a+"/"+b):g.path("/"+a+"/"+b)};q["delete"]=function(a,b,c,e){m.flashMessage=null;t({hdr:"Delete",body:"Are you sure you want to remove "+c+" from "+q.name+" "+e+"?",action:function(){var c;"permissions"==a?n()&&(c=s("base")+"permissions/"+b+"/",l.setUrl(c),l.destroy().success(function(b,d,c,e){$("#prompt-modal").modal("hide");q.search(f.related[a].iterator)}).error(function(a,
|
|
|
|
|
p.team_id+". GET status: "+b})});q.formSave=function(){m.flashMessage=null;l.setUrl(B+p.team_id+"/");var a={},b;for(b in f.fields)a[b]=q[b];l.put(a).success(function(a,b,d,c){"teams"==g.path().replace(/^\//,"").split("/")[0]?A():A(1)}).error(function(a,b,c,e){d(q,a,b,f,{hdr:"Error!",msg:"Failed to update team: "+p.team_id+". PUT status: "+b})})};q.formReset=function(){m.flashMessage=null;e.reset();for(var a in z)q[a]=z[a]};q.add=function(a){m.flashMessage=null;"permissions"==a?n()&&g.path("/"+w+"/"+
|
|
|
|
|
p.team_id+"/"+a+"/add"):g.path("/"+w+"/"+p.team_id+"/"+a)};q.edit=function(a,b,d){m.flashMessage=null;"permissions"==a?n()&&g.path("/"+w+"/"+p.team_id+"/"+a+"/"+b):g.path("/"+a+"/"+b)};q["delete"]=function(a,b,c,e){m.flashMessage=null;t({hdr:"Delete",body:"Are you sure you want to remove "+c+" from "+q.name+" "+e+"?",action:function(){var c;"permissions"==a?n()&&(c=s("base")+"permissions/"+b+"/",l.setUrl(c),l.destroy().success(function(b,d,c,e){$("#prompt-modal").modal("hide");q.search(f.related[a].iterator)}).error(function(a,
|
|
|
|
|
b,e,f){$("#prompt-modal").modal("hide");d(q,a,b,null,{hdr:"Error!",msg:"Call to "+c+" failed. DELETE returned status: "+b})})):(c=B+p.team_id+"/"+a+"/",l.setUrl(c),l.post({id:b,disassociate:1}).success(function(b,d,c,e){$("#prompt-modal").modal("hide");q.search(f.related[a].iterator)}).error(function(a,b,e,f){$("#prompt-modal").modal("hide");d(q,a,b,null,{hdr:"Error!",msg:"Call to "+c+" failed. POST returned status: "+b})}))}})}}TeamsEdit.$inject="$scope $rootScope $compile $location $log $routeParams TeamForm GenerateForm Rest Alert ProcessErrors LoadBreadCrumbs RelatedSearchInit RelatedPaginateInit ReturnToCaller ClearScope TeamLookUpOrganizationInit Prompt GetBasePath CheckAccess".split(" ");function UsersList(k,m,h,g,c,p,f,e,l,a,d,b,y,v,A,u,C){A("htmlTemplate");var t=C("users"),s=h.path().replace(/^\//,"").split("/")[0],n=l.inject(e,{mode:"users"==s?"edit":"select"});n.selected=[];m.flashMessage=null;b({scope:n,set:"users",list:e,url:t});y({scope:n,list:e,url:t});n.search(e.iterator);a();n.PostRefreshRemove&&n.PostRefreshRemove();n.PostRefreshRemove=n.$on("PostRefresh",function(){for(var a=0;a<n[e.name].length;a++)n[e.iterator+"_"+n[e.name][a].id+"_class"]=""});n.addUser=function(){h.path(h.path()+
|
|
|
|
|
"/add")};n.editUser=function(a){h.path(h.path()+"/"+a)};n.deleteUser=function(a,b){d({hdr:"Delete",body:"Are you sure you want to delete "+b+"?",action:function(){var b=t+a+"/";p.setUrl(b);p.destroy().success(function(a,b,d,c){$("#prompt-modal").modal("hide");n.search(e.iterator)}).error(function(a,d,c,e){$("#prompt-modal").modal("hide");u(n,a,d,null,{hdr:"Error!",msg:"Call to "+b+" failed. DELETE returned status: "+d})})}})};n.finishSelection=function(){var a;a="organizations"==s?C("organizations")+
|
|
|
|
|
c.organization_id+"/users/":C("teams")+c.team_id+"/users/";n.queue=[];n.$on("callFinished",function(){if(n.queue.length==n.selected.length){$('input[type="checkbox"]').prop("checked",!1);n.selected=[];for(var a=0,b=0;b<n.queue.length;b++)"error"==n.queue[b].result&&a++;0<a?f("Error","There was an error while adding one or more of the selected users."):v(1)}});if(0<n.selected.length)for(var b,d=0;d<n.selected.length;d++){b=null;for(var e=0;e<n.users.length;e++)n.users[e].id==n.selected[d]&&(b=n.users[e]);
|
|
|
|
|
@@ -151,9 +151,9 @@ label:"Name",type:"text",addRequired:!0,editRequired:!0,capitalize:!1,column:1},
|
|
|
|
|
"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:{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:{created:{label:"Created",type:"text",readonly:!0,"class":"span3",section:"Event Info"},status:{labelClass:"job-{{ status }}",icon:"icon-circle",type:"custom",control:'<div class="job-event-status job-{{ status }}">{{ status }}</div>',section:"Event"},host:{label:"Host",type:"text",readonly:!0,section:"Event"},task:{label:"Task",type:"text",
|
|
|
|
|
readonly:!0,section:"Event"},conditional:{label:"Conditional?",type:"checkbox",readonly:!0},msg:{label:"Message",type:"textarea",readonly:!0,section:"Results",rows:5},stdout:{label:"Standard Out",type:"textarea",readonly:!0,section:"Results",rows:5},stderr:{label:"Standard Error",type:"textarea",readonly:!0,section:"Results",rows:5},start:{label:"Start",type:"text",readonly:!0,section:"Timing"},end:{label:"End",type:"text",readonly:!0,section:"Timing"},delta:{label:"Elapsed",type:"text",readonly:!0,
|
|
|
|
|
section:"Timing"},module_name:{label:"Name",type:"text",readonly:!0,section:"Module"},module_args:{label:"Arguments",type:"text",readonly:!0,section:"Module"}},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>",
|
|
|
|
|
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:{status:{labelClass:"job-{{ status }}",icon:"icon-circle",type:"custom",control:'<div class="job-event-status job-{{ status }}">{{ status }}</div>',section:"Event"},id:{label:"ID",type:"text",readonly:!0,section:"Event","class":"span1"},created:{label:"Created",type:"text",readonly:!0,section:"Event"},host:{label:"Host",type:"text",readonly:!0,
|
|
|
|
|
section:"Event"},task:{label:"Task",type:"text",readonly:!0,section:"Event"},conditional:{label:"Conditional?",type:"checkbox",readonly:!0,section:"Event"},rc:{label:"Return Code",type:"text",readonly:!0,section:"Results","class":"span1"},msg:{label:"Message",type:"textarea",readonly:!0,section:"Results","class":"modal-input-xlarge",rows:1},stdout:{label:"Std Out",type:"textarea",readonly:!0,section:"Results","class":"modal-input-xlarge",rows:1},stderr:{label:"Std Error",type:"textarea",readonly:!0,
|
|
|
|
|
section:"Results","class":"modal-input-xlarge",rows:1},start:{label:"Start",type:"text",readonly:!0,section:"Timing"},end:{label:"End",type:"text",readonly:!0,section:"Timing"},delta:{label:"Elapsed",type:"text",readonly:!0,section:"Timing"},module_name:{label:"Name",type:"text",readonly:!0,section:"Module"},module_args:{label:"Arguments",type:"text",readonly:!0,section:"Module"}},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>",
|
|
|
|
|
dataTitle:"Forks",dataPlacement:"left"},limit:{label:"Limit",type:"text",addRequired:!1,editRequired:!1,column:2,awPopOver:'<p>Provide a host pattern to further constrain the list of hosts that will be managed or affected by the playbook. Multiple patterns can be separated by ; : or ,</p><p>For more information and examples see the <a href="http://ansible.cc/docs/patterns.html#selecting-targets" target="_blank">Selecting Targets section</a> under Inventory and Patterns in the Ansible documentation.</p>',
|
|
|
|
|
@@ -198,8 +198,9 @@ a})}));e||m("Access Denied","You do not have access to this function. Please con
|
|
|
|
|
0>=parseInt(g.free_instances)&&h("License Warning",'Your AnsibleWorks AWX License has reached capacity for the number of managed hosts allowed. You will not be able to add any additional hosts. To extend your license, please visit <a href="http://ansibleworks.com/ansibleworks-awx" target="_blank"><strong>ansibleworks.com/ansibleworks-awx.</strong></a>, or contact <a href="mailto:info@ansibleworks.com"><strong>info@ansibleworks.com</strong></a> for more information.',"alert-info",null,!0))}}]);angular.module("APIDefaults",["RestServices","Utilities"]).factory("GetAPIDefaults",["Alert","Rest","$rootScope",function(k,m,h){return function(g){function c(c){var a={};for(id in h.apiDefaults)if(id==c||id.iterator==c){a[id]=defaults[id];break}return a}function k(){if(f=={}&&5>e)e++,setTimeout(1E3,k());else if("success"==f.status)return c(g)}var f={},e=0;return null==h.apiDefaults||void 0==h.apiDefaults?(f={},m.setUrl("/api/v1"),m.get().success(function(c,a,d,b){defaults=c;for(var e in defaults)switch(e){case "organizations":dafaults[e].iterator=
|
|
|
|
|
"organization";break;case "jobs":defaults[e].iterator="job";break;case "users":defaults[e].iterator="user";break;case "teams":defaults[e].iterator="team";break;case "hosts":defaults[e].iterator="host";break;case "groups":defaults[e].iterator="group";break;case "projects":defaults[e].iterator="project"}h.apiDefaults=defaults;f={status:"success"}}).error(function(c,a,d,b){f={status:"error",msg:"Call to /api/v1 failed. GET returned status: "+a}}),k()):c(g)}}]);angular.module("ChildrenHelper",["RestServices","Utilities"]).factory("ToggleChildren",["Alert","Rest","GetBasePath","ProcessErrors","FormatDate",function(k,m,h,g,c){return function(c){function f(b){a[b].ngicon="icon-collapse-alt";for(var d=b+1;d<a.length;d++)a[d].parent==a[b].id&&(a[d].show=!0)}function e(b){a[b].ngicon="icon-expand-alt";for(var d=b+1;d<a.length;d++)a[d].parent==a[b].id&&(a[d].show=!1,a[d].related.children&&e(d))}var l=c.id,a=c.scope[c.list.name],d;c=!1;for(var b=0;b<a.length&&!1==
|
|
|
|
|
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(k,m,h,g,c,p,f,e,l,a,d,b){return function(l){var g=l.event_id;l=d("base")+"job_events/"+g+"/";var k=e.inject(f,{mode:"edit",modal:!0,related:!1});e.reset();k.formModalAction=function(){$("#form-modal").modal("hide")};k.formModalActionLabel="OK";
|
|
|
|
|
k.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?k.status=a.failed?"error":a.changed?"changed":"success":"event_data"==l?k.event_data=JSON.stringify(a.event_data,void 0,"\t"):"host"==l?a.summary_fields&&a.summary_fields.host&&(k.host=a.summary_fields.host.name):"created"==l?k.created=b(new Date(a.created)):a[l]&&(k[l]=a[l]);k.formModalHeader=a.event_display.replace(/^\u00a0*/g,
|
|
|
|
|
"")}).error(function(b,d,c,e){a(k,b,d,f,{hdr:"Error!",msg:"Failed to retrieve host: "+g+". GET status: "+d})});k.$$phase||k.$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(k,m,h,g,c,p,f,e,l,a,d,b,y,v,A){return function(b){var l=b.inventory_id,k=void 0!==b.group_id?b.group_id:
|
|
|
|
|
k.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)switch(l){case "status":k.status=a.failed?"error":a.changed?"changed":"success";break;case "created":k.created=b(new Date(a.created));break;case "host":a.summary_fields&&a.summary_fields.host&&(k.host=a.summary_fields.host.name);break;case "id":case "task":k[l]=a[l];break;case "msg":case "stdout":case "stderr":case "start":case "end":case "delta":case "rc":a.event_data&&
|
|
|
|
|
(a.event_data.res&&void 0!==a.event_data.res[l])&&(k[l]=a.event_data.res[l],"textarea"==f.fields[l].type&&(rows=(d=a.event_data.res[l].match(/\n/g))?d.length:1,rows=5<rows?5:rows,$('textarea[name="'+l+'"]').attr("rows",rows)));break;case "conditional":a.event_data.res&&(k[l]=a.event_data.res.is_conditional);break;case "module_name":case "module_args":a.event_data.res&&a.event_data.res.invocation&&(k[l]=a.event_data.res.invocation[l])}k.formModalHeader=a.event_display.replace(/^\u00a0*/g,"")}).error(function(b,
|
|
|
|
|
d,c,e){a(k,b,d,f,{hdr:"Error!",msg:"Failed to retrieve host: "+g+". GET status: "+d})});k.$$phase||k.$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(k,m,h,g,c,p,f,e,l,a,d,b,y,v,A){return function(b){var l=b.inventory_id,k=void 0!==b.group_id?b.group_id:
|
|
|
|
|
null;b=y("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";$(".popover").remove();$("#form-modal .btn-none").removeClass("btn-none").addClass("btn-success");$("#form-modal").modal({backdrop:"static",keyboard:!1});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?y("groups")+k+"/children/":y("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"),A({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,
|
|
|
|
|
@@ -211,9 +212,9 @@ m)}};k.formReset=function(){e.reset()}}}]).factory("GroupsEdit",["$rootScope","$
|
|
|
|
|
y(t);$("#form-modal .btn-none").removeClass("btn-none").addClass("btn-success");t.groupLoadedRemove&&t.groupLoadedRemove();t.groupLoadedRemove=t.$on("groupLoaded",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{var e="json"==t.parseType?JSON.parse(t.variables):jsyaml.load(t.variables);
|
|
|
|
|
if("object"!==typeof e)throw"failed to return an object!";var l={},n;for(n in f.fields)l[n]=t[n];l.inventory=k;c.setUrl(m);c.put(l).success(function(l,n,g,h){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(g){p("Error","Error parsing group variables. Parser returned: "+g)}};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(k,m,h,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+'"]'),
|
|
|
|
|
g="LI"==l.parent().last().prop("tagName")?l.parent().last():l.parent().parent().last(),h;h="group"==g.attr("type")?d("base")+"groups/"+g.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 "+$(g).attr("name")+"?");$("#prompt-action-btn").addClass("btn-danger");e.promptAction=function(){c.setUrl(h);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 "+h+" 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(k,m,h,g,c,p,f,e,l,a,d,b,y,v,A){return function(b){var l=
|
|
|
|
|
msg:"Failed to update group: "+h+". PUT status: "+d})})}catch(g){p("Error","Error parsing group variables. Parser returned: "+g)}};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(k,m,h,g,c,p,f,e,l,a,d){return function(b){var e=b.scope,l=b.group_id;b=b.inventory_id;var f=$('#tree-view li[group_id="'+l+'"]'),
|
|
|
|
|
g="LI"==f.parent().last().prop("tagName")?f.parent().last():f.parent().parent().last(),h;h="group"==g.attr("type")?d("base")+"groups/"+g.attr("group_id")+"/children/":d("inventory")+b+"/groups/";$("#prompt-header").text("Delete Group");$("#prompt-body").text("Are you sure you want to remove group "+$(f).attr("name")+" from "+$(g).attr("name")+"?");$("#prompt-action-btn").addClass("btn-danger");e.promptAction=function(){c.setUrl(h);c.post({id:l,disassociate:1}).success(function(a,b,d,c){$("#prompt-modal").modal("hide");
|
|
|
|
|
$("#tree-view").jstree("delete_node",f)}).error(function(b,d,c,f){$("#prompt-modal").modal("hide");RefreshTree({scope:e});a(e,b,d,null,{hdr:"Error!",msg:"Call to "+h+" 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(k,m,h,g,c,p,f,e,l,a,d,b,y,v,A){return function(b){var l=
|
|
|
|
|
b.inventory_id,g=b.group_id;f.iterator="subhost";f.name="subhosts";var h=y("inventory")+l+"/hosts/",n=e.inject(f,{id:"form-modal-body",mode:"select",breadCrumbs:!1,selectButton:!1});n.formModalActionLabel="Select";n.formModalHeader="Select Hosts";n.formModalCancelShow=!0;n.removeHostsReload&&n.removeHostsReload();n.removeHostsReload=n.$on("hostsReload",function(){A(b)});$(".popover").remove();$("#form-modal .btn-none").removeClass("btn-none").addClass("btn-success");$("#form-modal").modal({backdrop:"static",
|
|
|
|
|
keyboard:!1});n.selected=[];n.PostRefreshRemove&&n.PostRefreshRemove();n.PostRefreshRemove=n.$on("PostRefresh",function(){$("tr.success").each(function(a){a=$(this).attr("ng-class");n[a]=""})});a({scope:n,set:"subhosts",list:f,url:h});d({scope:n,list:f,url:h,mode:"lookup"});n.search(f.iterator);n.$$phase||n.$digest();n.formModalAction=function(){var a=y("groups")+g+"/hosts/";c.setUrl(a);n.queue=[];n.callFinishedRemove&&n.callFinishedRemove();n.callFinishedRemove=n.$on("callFinished",function(){if(n.queue.length==
|
|
|
|
|
n.selected.length){$('input[type="checkbox"]').prop("checked",!1);n.selected=[];for(var a=0,b=0;b<n.queue.length;b++)"error"==n.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");n.$emit("hostsReload")}});if(0<n.selected.length)for(var b=0;b<n.selected.length;b++){for(var a=null,d=0;d<n.subhosts.length;d++)n.subhosts[d].id==n.selected[b]&&(a=n.subhosts[d]);null!==a&&c.post(a).success(function(a,b,d,c){n.queue.push({result:"success",
|
|
|
|
|
@@ -323,9 +324,9 @@ a.editRequired?"required ":"";b+="add"==d.mode&&a.addRequired?"required ":"";b+=
|
|
|
|
|
b+=a.ngShow?this.attr(a,"ngShow"):"";b+=">\n";b+='<label class="control-label" for="'+c+'">';b+=a.awPopOver?this.attr(a,"awPopOver"):"";b+=a.label+"</label>\n";b+='<div class="controls">\n';b+=a.slider?'<div class="slider" id="'+c+'-slider"></div>\n':"";b+='<input type="text" value="'+a["default"]+'" ';b+=a["class"]?this.attr(a,"class"):"";b+=a.slider?'ng-slider="'+c+'" ':"";b+='ng-model="'+c+'" ';b+='name="'+c+'" ';b+=a.min||0==a.min?this.attr(a,"min"):"";b+=a.max?this.attr(a,"max"):"";b+=a.ngChange?
|
|
|
|
|
this.attr(a,"ngChange"):"";b+=a.slider?'id="'+c+'-number"':a.id?this.attr(a,"id"):"";b+="edit"==d.mode&&a.editRequired?"required ":"";b+="add"==d.mode&&a.addRequired?"required ":"";b+=a.readonly?"readonly ":"";b+=a.integer?"integer ":"";b+="/>\n";b+="<br />\n";if("add"==d.mode&&a.addRequired||"edit"==d.mode&&a.editRequired)b+='<span class="error" ng-show="'+this.form.name+"_form."+c+".$dirty && "+this.form.name+"_form."+c+'.$error.required">A value is required!</span>\n';a.integer&&(b+='<span class="error" ng-show="'+
|
|
|
|
|
this.form.name+"_form."+c+'.$error.integer">Must be an integer value</span>\n');if(a.min||a.max)b+='<span class="error" ng-show="'+this.form.name+"_form."+c+".$error.min || "+this.form.name+"_form."+c+'.$error.max">Must be in range '+a.min+" to "+a.max+"</span>\n";b+='<span class="error api-error" ng-bind="'+c+'_api_error"></span>\n';b+="</div>\n";b+="</div>\n"}if("checkbox"==a.type&&(!a.readonly||a.readonly&&"edit"==d.mode))b+='<div class="control-group" ',b+=a.ngShow?this.attr(a,"ngShow"):"",b+=
|
|
|
|
|
">\n",b+='<div class="controls">\n',b+='<label class="checkbox">',b+="<input ",b+=this.attr(a,"type"),b+='ng-model="'+c+'" ',b+='name="'+c+'" ',b+=a.ngChange?this.attr(a,"ngChange"):"",b+=a.id?this.attr(a,"id"):"",b+=this.attr(a,"trueValue"),b+=this.attr(a,"falseValue"),b+=a.checked?"checked ":"",b+=a.readonly?"readonly ":"",b+=" /> "+a.label+"\n",b+=a.awPopOver?this.attr(a,"awPopOver"):"",b+="</label>\n",b+='<span class="error api-error" ng-bind="'+c+'_api_error"></span>\n',b+="</div>\n",b+="</div>\n";
|
|
|
|
|
">\n",b+='<div class="controls">\n',b+='<label class="checkbox">',b+="<input ",b+=this.attr(a,"type"),b+='ng-model="'+c+'" ',b+='name="'+c+'" ',b+=a.ngChange?this.attr(a,"ngChange"):"",b+=a.id?this.attr(a,"id"):"",b+=this.attr(a,"trueValue"),b+=this.attr(a,"falseValue"),b+=a.checked?"checked ":"",b+=a.readonly?"disabled ":"",b+=" /> "+a.label+"\n",b+=a.awPopOver?this.attr(a,"awPopOver"):"",b+="</label>\n",b+='<span class="error api-error" ng-bind="'+c+'_api_error"></span>\n',b+="</div>\n",b+="</div>\n";
|
|
|
|
|
if("radio"==a.type&&(!a.readonly||a.readonly&&"edit"==d.mode)){for(var b=b+'<div class="control-group" ',b=b+(a.ngShow?this.attr(a,"ngShow"):""),b=b+">\n",b=b+('<label class="control-label" for="'+c+'">'),b=b+(a.awPopOver?this.attr(a,"awPopOver"):""),b=b+(a.label+"</label>\n"),b=b+'<div class="controls">\n',e=0;e<a.options.length;e++)b+='<label class="radio inline" ',b+=a.options[e].ngShow?this.attr(a.options[e],"ngShow"):"",b+=">",b+='<input type="radio" ',b+='name="'+c+'" ',b+='value="'+a.options[e].value+
|
|
|
|
|
'" ',b+='ng-model="'+c+'" ',b+=a.ngChange?this.attr(a,"ngChange"):"",b+=a.readonly?"readonly ":"",b+="edit"==d.mode&&a.editRequired?"required ":"",b+="add"==d.mode&&a.addRequired?"required ":"",b+=" /> "+a.options[e].label+"\n",b+="</label>\n";if("add"==d.mode&&a.addRequired||"edit"==d.mode&&a.editRequired)b+='<p><span class="error" ng-show="'+this.form.name+"_form."+c+".$dirty && "+this.form.name+"_form."+c+'.$error.required">A value is required!</span></p>\n';b+='<p><span class="error api-error" ng-bind="'+
|
|
|
|
|
'" ',b+='ng-model="'+c+'" ',b+=a.ngChange?this.attr(a,"ngChange"):"",b+=a.readonly?"disabled ":"",b+="edit"==d.mode&&a.editRequired?"required ":"",b+="add"==d.mode&&a.addRequired?"required ":"",b+=" /> "+a.options[e].label+"\n",b+="</label>\n";if("add"==d.mode&&a.addRequired||"edit"==d.mode&&a.editRequired)b+='<p><span class="error" ng-show="'+this.form.name+"_form."+c+".$dirty && "+this.form.name+"_form."+c+'.$error.required">A value is required!</span></p>\n';b+='<p><span class="error api-error" ng-bind="'+
|
|
|
|
|
c+'_api_error"></span></p>\n';b+="</div>\n";b+="</div>\n"}if("hidden"==a.type&&("edit"==d.mode&&a.includeOnEdit||"add"==d.mode&&a.includeOnAdd))b+='<input type="hidden" ng-model="'+c+'" name="'+c+'" />';if("lookup"==a.type&&(void 0==a.excludeMode||a.excludeMode!=d.mode)){b+='<div class="control-group"';b+=a.ngShow?this.attr(a,"ngShow"):"";b+=">\n";b+='<label class="control-label" for="'+c+'">';b+=a.awPopOver?this.attr(a,"awPopOver"):"";b+=a.label+"</label>\n";b+='<div class="controls">\n';b+='<div class="input-prepend">\n';
|
|
|
|
|
b+='<button class="lookup-btn btn" '+this.attr(a,"ngClick")+'><i class="icon-search"></i></button>\n';b+='<input class="input-medium" type="text" ';b+='ng-model="'+a.sourceModel+"_"+a.sourceField+'" ';b+='name="'+a.sourceModel+"_"+a.sourceField+'" ';b+=a.ngChange?this.attr(a,"ngChange"):"";b+=a.id?this.attr(a,"id"):"";b+=a.placeholder?this.attr(a,"placeholder"):"";b+="edit"==d.mode&&a.editRequired?"required ":"";b+=a.awRequiredWhen?'data-awrequired-init="'+a.awRequiredWhen.init+'" aw-required-when="'+
|
|
|
|
|
a.awRequiredWhen.variable+'" ':"";b+=" awlookup />\n";b+="</div><br />\n";if("add"==d.mode&&a.addRequired||"edit"==d.mode&&a.editRequired||a.awRequiredWhen)b+='<span class="error" ng-show="'+this.form.name+"_form."+a.sourceModel+"_"+a.sourceField+".$dirty && "+this.form.name+"_form."+a.sourceModel+"_"+a.sourceField+'.$error.required">A value is required!</span>\n';b+='<span class="error" ng-show="'+this.form.name+"_form."+a.sourceModel+"_"+a.sourceField+".$dirty && "+this.form.name+"_form."+a.sourceModel+
|
|
|
|
|
@@ -334,13 +335,13 @@ a.label:"",b+="</label>\n",b+='<div class="controls">\n',b+=a.control,b+="</div>
|
|
|
|
|
'<div class="well">\n';if(this.form.statusActions){var a=a+'<div class="status-actions">\n',d;for(action in this.form.statusActions)d=this.form.statusActions[action],a+="<button "+this.attr(d,"ngClick")+'class="btn btn-small',a+=d["class"]?" "+d["class"]:"",a+='" ',a+=d.awToolTip?this.attr(d,"awToolTip"):"",a+=d.awToolTip?'data-placement="top" ':"",a+=" >"+this.icon(d.icon),a+=d.label?d.label:"",a+="</button> ";a+="</div>\n";a+='<div class="status-spin"><i class="icon-spinner icon-spin" ng-show="statusSearchSpin == true"></i></div>\n'}var a=
|
|
|
|
|
a+'<div class="status-fields">\n',b;for(b in this.form.statusFields)d=this.form.statusFields[b],a+=this.buildField(b,d,c);a+="</div>\x3c!-- status fields --\x3e\n";a+="</div>\x3c!-- well --\x3e\n"}if(this.form.fieldsAsHeader){a+='<div class="well">\n';a+='<form class="form-inline" name="'+this.form.name+'_form" id="'+this.form.name+'" novalidate >\n';for(b in this.form.fields)d=this.form.fields[b],a+=this.headerField(b,d,c);a+="</form>\n";a+="</div>\n"}else{this.form.collapse&&this.form.collapseMode==
|
|
|
|
|
c.mode&&(a+='<div id="'+this.form.name+'-collapse-0" ',a+=this.form.collapseOpen?'data-open="true" ':"",a+='class="jqui-accordion">\n',a+="<h3>"+this.form.collapseTitle+"<h3>\n",a+="<div>\n");this.has("well")&&(a+='<div class="well">\n');a+='<form class="form-horizontal';a+=this.form["class"]?" "+this.form["class"]:"";a+='" name="'+this.form.name+'_form" id="'+this.form.name+'" autocomplete="false" novalidate>\n';a+='<div ng-show="flashMessage != null && flashMessage != undefined" class="alert alert-info">{{ flashMessage }}</div>\n';
|
|
|
|
|
if(this.form.twoColumns){a+='<div class="row-fluid">\n';a+='<div class="span6">\n';for(b in this.form.fields)d=this.form.fields[b],1==d.column&&(a+=this.buildField(b,d,c));a+="</div>\x3c!-- column 1 --\x3e\n";a+='<div class="span6">\n';for(b in this.form.fields)d=this.form.fields[b],2==d.column&&(a+=this.buildField(b,d,c));a+="</div>\x3c!-- column 2 --\x3e\n";a+="</div>\x3c!-- inner row --\x3e\n"}else for(b in this.form.fields)d=this.form.fields[b],a+=this.buildField(b,d,c);if(!this.modal){this.has("buttons")&&
|
|
|
|
|
(a+=this.form.twoColumns?"<hr />":"",a+='<div class="control-group">\n',a+='<div class="controls buttons">\n');for(var e in this.form.buttons)d=this.form.buttons[e],a+="<button ",a+='class="btn btn-small',a+=d["class"]?" "+d["class"]:"",a+='" ',d.ngClick&&(a+=this.attr(d,"ngClick")),d.ngDisabled&&(a="reset"!==e?a+('ng-disabled="'+this.form.name+"_form.$pristine || "+this.form.name+"_form.$invalid"):a+('ng-disabled="'+this.form.name+"_form.$pristine"),a+=this.form.allowReadonly?" || "+this.form.name+
|
|
|
|
|
"ReadOnly == true":"",a+='" '),a+=">",d.icon&&(a+=this.icon(d.icon)),a+=d.label+"</button>\n";this.has("buttons")&&(a+="</div>\n",a+="</div>\n");a+="</form>\n"}this.has("well")&&(a+="</div>\n");this.form.collapse&&this.form.collapseMode==c.mode&&(a+="</div>\n",a+="</div>\n")}if(!this.modal&&this.form.items)for(itm in this.form.items){a+='<div class="well form-items">\n';a+=g({iterator:this.form.items[itm].iterator,template:this.form.items[itm],mini:!1,label:"Filter Events"});a+='<div class="item-count pull-right">Viewing {{ '+
|
|
|
|
|
this.form.items[itm].iterator+"Page + 1 }} of {{ "+this.form.items[itm].iterator+"Count }}</div>\n";a+="<hr />\n";a+='<ul class="pager">\n';a+='<li ng-class="'+this.form.items[itm].iterator+'PrevUrlDisable"><a href="" ng-click="prevSet(\''+this.form.items[itm].set+"','"+this.form.items[itm].iterator+"')\">← 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+"')\">→ Next</a></li>\n";
|
|
|
|
|
a+="</ul>\n";a+='<form class="form-horizontal" name="'+this.form.name+'_items_form" id="'+this.form.name+'_items_form" novalidate>\n';for(b in this.form.items[itm].fields)d=this.form.items[itm].fields[b],a+=this.buildField(b,d,c);a+="</form>\n";a+='<ul class="pager">\n';a+='<li ng-class="'+this.form.items[itm].iterator+'PrevUrlDisable"><a href="" ng-click="prevSet(\''+this.form.items[itm].set+"','"+this.form.items[itm].iterator+"')\">← 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+"')\">→ 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" aw-tool-tip="Add existing groups or create a new group" data-placement="bottom"><i class="icon-plus"></i> Add Groups</button>',html+='<button ng-click="editGroup()" ng-hide="groupEditHide" id="inv-group-edit" class="btn btn-mini btn-success" aw-tool-tip="Edit the selected group" data-placement="bottom" <i class="icon-edit"></i> Edit Group</button>',
|
|
|
|
|
if(this.form.twoColumns){a+='<div class="row-fluid">\n';a+='<div class="span6">\n';for(b in this.form.fields)d=this.form.fields[b],1==d.column&&(a+=this.buildField(b,d,c));a+="</div>\x3c!-- column 1 --\x3e\n";a+='<div class="span6">\n';for(b in this.form.fields)d=this.form.fields[b],2==d.column&&(a+=this.buildField(b,d,c));a+="</div>\x3c!-- column 2 --\x3e\n";a+="</div>\x3c!-- inner row --\x3e\n"}else{var e="";for(b in this.form.fields)d=this.form.fields[b],d.section&&d.section!=e&&(a+='<div class="form-section-title">'+
|
|
|
|
|
d.section+"</div>\n",e=d.section),a+=this.buildField(b,d,c)}if(!this.modal){this.has("buttons")&&(a+=this.form.twoColumns?"<hr />":"",a+='<div class="control-group">\n',a+='<div class="controls buttons">\n');for(var f in this.form.buttons)d=this.form.buttons[f],a+="<button ",a+='class="btn btn-small',a+=d["class"]?" "+d["class"]:"",a+='" ',d.ngClick&&(a+=this.attr(d,"ngClick")),d.ngDisabled&&(a="reset"!==f?a+('ng-disabled="'+this.form.name+"_form.$pristine || "+this.form.name+"_form.$invalid"):a+
|
|
|
|
|
('ng-disabled="'+this.form.name+"_form.$pristine"),a+=this.form.allowReadonly?" || "+this.form.name+"ReadOnly == true":"",a+='" '),a+=">",d.icon&&(a+=this.icon(d.icon)),a+=d.label+"</button>\n";this.has("buttons")&&(a+="</div>\n",a+="</div>\n");a+="</form>\n"}this.has("well")&&(a+="</div>\n");this.form.collapse&&this.form.collapseMode==c.mode&&(a+="</div>\n",a+="</div>\n")}if(!this.modal&&this.form.items)for(itm in this.form.items){a+='<div class="well form-items">\n';a+=g({iterator:this.form.items[itm].iterator,
|
|
|
|
|
template:this.form.items[itm],mini:!1,label:"Filter Events"});a+='<div class="item-count pull-right">Viewing {{ '+this.form.items[itm].iterator+"Page + 1 }} of {{ "+this.form.items[itm].iterator+"Count }}</div>\n";a+="<hr />\n";a+='<ul class="pager">\n';a+='<li ng-class="'+this.form.items[itm].iterator+'PrevUrlDisable"><a href="" ng-click="prevSet(\''+this.form.items[itm].set+"','"+this.form.items[itm].iterator+"')\">← 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+"')\">→ Next</a></li>\n";a+="</ul>\n";a+='<form class="form-horizontal" name="'+this.form.name+'_items_form" id="'+this.form.name+'_items_form" novalidate>\n';for(b in this.form.items[itm].fields)d=this.form.items[itm].fields[b],a+=this.buildField(b,d,c);a+="</form>\n";a+='<ul class="pager">\n';a+='<li ng-class="'+this.form.items[itm].iterator+'PrevUrlDisable"><a href="" ng-click="prevSet(\''+this.form.items[itm].set+"','"+this.form.items[itm].iterator+
|
|
|
|
|
"')\">← 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+"')\">→ 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" aw-tool-tip="Add existing groups or create a new group" data-placement="bottom"><i class="icon-plus"></i> Add Groups</button>',html+='<button ng-click="editGroup()" ng-hide="groupEditHide" id="inv-group-edit" class="btn btn-mini btn-success" aw-tool-tip="Edit the selected group" data-placement="bottom" <i class="icon-edit"></i> Edit Group</button>',
|
|
|
|
|
html+='<button ng-click="deleteGroup()" ng-hide="groupDeleteHide" id="inv-group-delete" aw-tool-tip="Delete the selected group" data-placement="bottom" 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">',html+='<span ng-show="has_active_failures == true"><label class="checkbox inline">',html+='<input ng-model="inventoryFailureFilter" ng-change="filterInventory()" type="checkbox">Show only groups with failures</label></span></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 ',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+=
|
|
|
|
|
|