403 error when licensed host count is exceeded now displays the 'detail' message received from the API.

This commit is contained in:
chouseknecht 2013-07-08 15:33:44 -04:00
parent 554f8225d8
commit ad2e762292
4 changed files with 53 additions and 44 deletions

View File

@ -4,7 +4,7 @@
*
* awx-min.js
*
* master-a774576, Mon Jul 8 13:28:56 2013 -0400
* master-4ad18dd, Mon Jul 8 14:48:03 2013 -0400
*
*/
var urlPrefix="/static/";
@ -42,7 +42,7 @@ a+"/");p.get().success(function(a,b,d,c){return a.name})};s.finishSelection=func
0;d<s.inventories.length;d++)s.inventories[d].id==s.selected[b]&&(a=s.inventories[d]);null!==a&&p.post(a).success(function(a,b,d,c){s.queue.push({result:"success",data:a,status:b});s.$emit("callFinished")}).error(function(a,b,d,c){s.queue.push({result:"error",data:a,status:b,headers:d});s.$emit("callFinished")})}else w()};s.toggle_inventory=function(a){"success"==s[e.iterator+"_"+a+"_class"]?(s[e.iterator+"_"+a+"_class"]="",document.getElementById("check_"+a).checked=!1,-1<s.selected.indexOf(a)&&
s.selected.splice(s.selected.indexOf(a),1)):(s[e.iterator+"_"+a+"_class"]="success",document.getElementById("check_"+a).checked=!0,-1==s.selected.indexOf(a)&&s.selected.push(a))};s.viewJobs=function(a){k.url("/jobs/?inventory__int="+a+"&order_by=status")}}InventoriesList.$inject="$scope $rootScope $location $log $routeParams Rest Alert InventoryList GenerateList LoadBreadCrumbs Prompt SearchInit PaginateInit ReturnToCaller ClearScope ProcessErrors GetBasePath".split(" ");
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 h=a.id;v.variables?(l.setUrl(a.related.variable_data),l.put(b).success(function(a,b,d,c){g.path("/inventories/"+h)}).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/"+h)}).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: "+
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,
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);
@ -53,8 +53,8 @@ action:function(a){q({inventory_id:J,group_id:$(a).attr("group_id")})}},edit:{la
!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>
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 h=void 0;for(h in c.res)if(("msg"==h||"stdout"==h||"stderr"==
h)&&null!==c.res[h]&&""!==c.res[h]){f+="<label>";switch(h){case "msg":case "stdout":f+="Output:";break;case "stderr":f+="Error:"}f+="</label>\n";n=(n=c.res[h].match(/\n/g))?n.length:1;f+='<textarea readonly class="input-xxlarge" rows="'+n+'">'+c.res[h]+"</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=
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/"+
c.id+"/job_host_summaries")}}JobEventsList.$inject="$scope $rootScope $location $log $routeParams Rest Alert JobEventList GenerateList LoadBreadCrumbs Prompt SearchInit PaginateInit ReturnToCaller ClearScope ProcessErrors GetBasePath LookUpInit ToggleChildren EventView FormatDate".split(" ");
function JobEventsEdit(h,m,k,g,c,p,f,e,l,a,d,b,z,w,B){z("htmlTemplate");var u=e.inject(f,{mode:"edit",related:!0});e.reset();h=w("base")+"job_events/"+p.event_id+"/";g.path().replace(/^\//,"").split("/");l.setUrl(h);l.get().success(function(a,d,c,e){b({path:"/job_events/"+p.event_id,title:a.event});for(var l in f.fields)"status"==l?u.status=a.failed?"error":"success":"event_data"==l?u.event_data=JSON.stringify(a.event_data,void 0,"\t"):"created"==l?u.created=B(new Date(a.created)):a[l]&&(u[l]=a[l])}).error(function(a,
@ -62,7 +62,7 @@ b,c,e){d(u,a,b,f,{hdr:"Error!",msg:"Failed to retrieve event detail: "+p.event_i
z({scope:t,list:e,url:h});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});k.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(){k.path("/jobs/"+c.id)};t.jobEvents=function(){k.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(h,m,k,g,c,p,f,e,l,a,d,b,z,w,B,u,x,t,s,n){B("htmlTemplate");var C=x("jobs");k.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:C});z({scope:q,
list:e,url:C});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);c.order_by&&q.sort(c.order_by);a();q.refreshJob=function(){q.search(e.iterator)};q.editJob=function(b,d){a({path:"/jobs/"+b,title:d});k.path(k.path()+"/"+b)};q.viewEvents=function(b,d){a({path:"/jobs/"+b,title:d});k.path(k.path()+"/"+b+"/job_events")};q.viewSummary=function(b,d){a({path:"/jobs/"+b,title:d});k.path(k.path()+
"/"+b+"/job_host_summaries")};q.deleteJob=function(a,b){p.setUrl(C+a+"/");p.get().success(function(b,c,f,l){var n,h;"pending"==b.status||"running"==b.status?(n=b.related.cancel,h="cancel",b="Cancel Job"):(n=C+a+"/",h="delete",b="Delete Job");d({hdr:b,body:"Are you sure you want to "+h+" job "+a+"?",action:function(){p.setUrl(n);"cancel"==h?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,
"/"+b+"/job_host_summaries")};q.deleteJob=function(a,b){p.setUrl(C+a+"/");p.get().success(function(b,c,f,l){var n,k;"pending"==b.status||"running"==b.status?(n=b.related.cancel,k="cancel",b="Cancel Job"):(n=C+a+"/",k="delete",b="Delete Job");d({hdr:b,body:"Are you sure you want to "+k+" job "+a+"?",action:function(){p.setUrl(n);"cancel"==k?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(" ");
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(/^\//,
@ -113,7 +113,7 @@ n.selected[b]&&(a=n.projects[d]);null!==a&&p.post(a).success(function(a,b,d,c){n
function ProjectsAdd(h,m,k,g,c,p,f,e,l,a,d,b,z,w,B,u){z("htmlTemplate");var x=g.path().replace(/^\//,"").split("/")[0],t=w("projects"),s=e.inject(f,{mode:"add",related:!1}),n={};e.reset();b();u({scope:s,master:n});s.formSave=function(){var a={},b;for(b in f.fields)a[b]=s[b];b="teams"==x?w("teams")+p.team_id+"/projects/":t;l.setUrl(b);l.post(a).success(function(a,b,d,c){m.flashMessage="New project successfully created!";"projects"==x?B():B(1)}).error(function(a,b,c,e){d(s,a,b,f,{hdr:"Error!",msg:"Failed to create new project. Post returned status: "+
b})})};s.formReset=function(){m.flashMessage=null;e.reset();for(var a in n)s[a]=n[a]}}ProjectsAdd.$inject="$scope $rootScope $compile $location $log $routeParams ProjectsForm GenerateForm Rest Alert ProcessErrors LoadBreadCrumbs ClearScope GetBasePath ReturnToCaller GetProjectPath".split(" ");
function ProjectsEdit(h,m,k,g,c,p,f,e,l,a,d,b,z,w,B,u,x,t,s){u("htmlTemplate");var n=e.inject(f,{mode:"edit",related:!0});e.reset();var C=x("projects")+p.id+"/",q=g.path().replace(/^\//,"").split("/")[0],v={},A=p.id,E={};n.project_local_paths=[];n.base_dir="";n.projectLoadedRemove&&n.projectLoadedRemove();n.projectLoadedRemove=n.$on("projectLoaded",function(){for(var a in E)n.search(E[a].iterator);s({scope:n,master:v})});l.setUrl(C);l.get({params:{id:A}}).success(function(a,d,c,e){b({path:"/projects/"+
A,title:a.name});for(var l in f.fields)a[l]&&(n[l]=a[l],v[l]=a[l]);a=a.related;for(var h in f.related)a[h]&&(E[h]={url:a[h],iterator:f.related[h].iterator});z({scope:n,form:f,relatedSets:E});w({scope:n,relatedSets:E});n.$emit("projectLoaded")}).error(function(a,b,c,e){d(n,a,b,f,{hdr:"Error!",msg:"Failed to retrieve project: "+A+". GET status: "+b})});n.formSave=function(){m.flashMessage=null;var a={},b;for(b in f.fields)a[b]=n[b];l.setUrl(C);l.put(a).success(function(a,b,d,c){t()}).error(function(a,
A,title:a.name});for(var l in f.fields)a[l]&&(n[l]=a[l],v[l]=a[l]);a=a.related;for(var k in f.related)a[k]&&(E[k]={url:a[k],iterator:f.related[k].iterator});z({scope:n,form:f,relatedSets:E});w({scope:n,relatedSets:E});n.$emit("projectLoaded")}).error(function(a,b,c,e){d(n,a,b,f,{hdr:"Error!",msg:"Failed to retrieve project: "+A+". GET status: "+b})});n.formSave=function(){m.flashMessage=null;var a={},b;for(b in f.fields)a[b]=n[b];l.setUrl(C);l.put(a).success(function(a,b,d,c){t()}).error(function(a,
b,c,e){d(n,a,b,f,{hdr:"Error!",msg:"Failed to update project: "+A+". PUT status: "+b})})};n.formReset=function(){m.flashMessage=null;e.reset();for(var a in v)n[a]=v[a]};n.add=function(a){m.flashMessage=null;g.path("/"+q+"/"+p.id+"/"+a)};n.edit=function(a,b,d){m.flashMessage=null;g.path("/"+q+"/"+p.id+"/"+a+"/"+b)};n["delete"]=function(a,b,c,e){B({hdr:"Delete",body:"Are you sure you want to remove "+c+" from "+n.name+" "+e+"?",action:function(){var c=x("projects")+A+"/"+a+"/";m.flashMessage=null;l.setUrl(c);
l.post({id:b,disassociate:1}).success(function(b,d,c,e){$("#prompt-modal").modal("hide");n.search(f.related[a].iterator)}).error(function(a,b,f,e){$("#prompt-modal").modal("hide");d(n,a,b,null,{hdr:"Error!",msg:"Call to "+c+" failed. POST returned status: "+b})})}})}}ProjectsEdit.$inject="$scope $rootScope $compile $location $log $routeParams ProjectsForm GenerateForm Rest Alert ProcessErrors LoadBreadCrumbs RelatedSearchInit RelatedPaginateInit Prompt ClearScope GetBasePath ReturnToCaller GetProjectPath".split(" ");function TeamsList(h,m,k,g,c,p,f,e,l,a,d,b,z,w,B,u,x,t){B("htmlTemplate");var s=t("teams");h="teams"==k.path().replace(/^\//,"").split("/")[0]?"edit":"select";var n=l.inject(e,{mode:h});n.selected=[];n.PostRefreshRemove&&n.PostRefreshRemove();n.PostRefershRemove=n.$on("PostRefresh",function(){for(var a=0;a<n.teams.length;a++)n.teams[a].organization_name=n.teams[a].summary_fields.organization.name;$("tr.success").each(function(a){a=$(this).attr("ng-class");n[a]=""})});b({scope:n,set:"teams",list:e,
url:s});z({scope:n,list:e,url:s});n.search(e.iterator);a();n.addTeam=function(){k.path(k.path()+"/add")};n.editTeam=function(a){k.path(k.path()+"/"+a)};n.deleteTeam=function(a,b){d({hdr:"Delete",body:"Are you sure you want to delete "+b+"?",action:function(){var b=s+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,f){$("#prompt-modal").modal("hide");u(n,a,d,null,{hdr:"Error!",msg:"Call to "+b+" failed. DELETE returned status: "+
@ -185,16 +185,16 @@ iterator:"organization",open:!1,fields:{name:{key:!0,label:"Name"},description:{
a})}));e||m("Access Denied","You do not have access to this function. Please contact your system administrator.");return e}}]).factory("CheckLicense",["$rootScope","$cookieStore","Alert","$location","Authorization",function(h,m,k,g,c){return function(){var g=m.get("license");g&&!c.licenseTested()&&(g.tested=!0,m.remove("license"),m.put("license",g),h.license_tested=!0,void 0!==g.key_valid&&!1==g.key_valid?k("License Error",'Something is wrong with your /etc/awx/license file on this server. Please contact <a href="mailto:info@ansibleworks.com">info@ansibleworks.com</a> for assistance.',
"alert-error",null,!1,!0):void 0!==g.demo&&!0==g.demo&&k("AWX Demo",'Thank you for trying AnsibleWorks AWX. You can use this edition to manage up to 5 hosts. Should you wish to acquire a license for additional servers, 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 assistance.',"alert-info"),void 0!==g.date_warning&&
!0==g.date_warning&&k("License Expired",'Your AnsibleWorks AWX License has expired and is no longer compliant. You can continue, but you will be unable to add any additional hosts. Please visit <a href="http://ansibleworks.com/ansibleworks-awx" target="_blank"><strong>ansibleworks.com/ansibleworks-awx</strong></a> for license and renewal information, or contact <a href="mailto:info@ansibleworks.com"><strong>info@ansibleworks.com</strong></a> for assistance.',"alert-info"),void 0!==g.free_instances&&
0>=parseInt(g.free_instances)&&k("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(h,m,k){return function(h){function c(c){var a={};for(id in k.apiDefaults)if(id==c||id.iterator==c){a[id]=defaults[id];break}return a}function p(){if(f=={}&&5>e)e++,setTimeout(1E3,p());else if("success"==f.status)return c(h)}var f={},e=0;return null==k.apiDefaults||void 0==k.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"}k.apiDefaults=defaults;f={status:"success"}}).error(function(c,a,d,b){f={status:"error",msg:"Call to /api/v1 failed. GET returned status: "+a}}),p()):c(h)}}]);angular.module("ChildrenHelper",["RestServices","Utilities"]).factory("ToggleChildren",["Alert","Rest","GetBasePath","ProcessErrors","FormatDate",function(h,m,k,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(h,m,k,g,c,p,f,e,l,a,d,b){return function(l){var h=l.event_id;l=d("base")+"job_events/"+h+"/";var g=e.inject(f,{mode:"edit",modal:!0,related:!1});e.reset();g.formModalAction=function(){$("#form-modal").modal("hide")};g.formModalActionLabel="OK";
0>=parseInt(g.free_instances)&&k("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(h,m,k){return function(g){function c(c){var a={};for(id in k.apiDefaults)if(id==c||id.iterator==c){a[id]=defaults[id];break}return a}function h(){if(f=={}&&5>e)e++,setTimeout(1E3,h());else if("success"==f.status)return c(g)}var f={},e=0;return null==k.apiDefaults||void 0==k.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"}k.apiDefaults=defaults;f={status:"success"}}).error(function(c,a,d,b){f={status:"error",msg:"Call to /api/v1 failed. GET returned status: "+a}}),h()):c(g)}}]);angular.module("ChildrenHelper",["RestServices","Utilities"]).factory("ToggleChildren",["Alert","Rest","GetBasePath","ProcessErrors","FormatDate",function(h,m,k,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(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: "+h+". 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,h=void 0!==b.group_id?b.group_id:
null;b=z("inventory")+l+"/groups/";var k=e.inject(f,{id:"form-modal-body",mode:"select",breadCrumbs:!1,selectButton:!1});k.formModalActionLabel="Finished";k.formModalHeader="Add Group";k.formModalCancelShow=!0;k.formModalActionClass="btn btn-success";$("#form-modal .btn-none").removeClass("btn-none").addClass("btn-success");$("#form-modal").modal();k.selected=[];k.PostRefreshRemove&&k.PostRefreshRemove();k.PostRefreshRemove=k.$on("PostRefresh",function(){$("tr.success").each(function(a){a=$(this).attr("ng-class");
k[a]=""});if(g.group_id)for(var a=0;a<k.groups.length;a++)k.groups[a].id==g.group_id&&k.groups.splice(a,1)});a({scope:k,set:"groups",list:f,url:b});d({scope:k,list:f,url:b,mode:"lookup"});k.search(f.iterator);k.$$phase||k.$digest();k.formModalAction=function(){var a=h?z("groups")+h+"/children/":z("inventory")+l+"/groups/";c.setUrl(a);k.queue=[];k.callFinishedRemove&&k.callFinishedRemove();k.callFinishedRemove=k.$on("callFinished",function(){if(k.queue.length==k.selected.length){$('input[type="checkbox"]').prop("checked",
!1);k.selected=[];for(var a=0,b=0;b<k.queue.length;b++)"error"==k.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:k}))}});if(0<k.selected.length)for(var b=0;b<k.selected.length;b++){for(var a=null,d=0;d<k.groups.length;d++)k.groups[d].id==k.selected[b]&&(a=k.groups[d]);null!==a&&c.post(a).success(function(a,b,d,c){k.queue.push({result:"success",data:a,status:b});k.$emit("callFinished")}).error(function(a,
b,d,c){k.queue.push({result:"error",data:a,status:b,headers:d});k.$emit("callFinished")})}else $("#form-modal").modal("hide")};k.toggle_group=function(a){"success"==k[f.iterator+"_"+a+"_class"]?(k[f.iterator+"_"+a+"_class"]="",document.getElementById("check_"+a).checked=!1,-1<k.selected.indexOf(a)&&k.selected.splice(k.selected.indexOf(a),1)):(k[f.iterator+"_"+a+"_class"]="success",document.getElementById("check_"+a).checked=!0,-1==k.selected.indexOf(a)&&k.selected.push(a))};k.createGroup=function(){$("#form-modal").modal("hide");
w({inventory_id:l,group_id:h})}}}]).factory("GroupsAdd",["$rootScope","$location","$log","$routeParams","Rest","Alert","GroupForm","GenerateForm","Prompt","ProcessErrors","GetBasePath","RefreshTree","ParseTypeChange",function(h,m,k,g,c,p,f,e,l,a,d,b,z){return function(l){var h=l.inventory_id;l=void 0!==l.group_id?l.group_id:null;var k=null!==l?d("groups")+l+"/children/":d("inventory")+h+"/groups/",g=e.inject(f,{mode:"add",modal:!0,related:!1});g.formModalActionLabel="Save";g.formModalHeader="Create Group";
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");
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");
w({inventory_id:l,group_id:k})}}}]).factory("GroupsAdd",["$rootScope","$location","$log","$routeParams","Rest","Alert","GroupForm","GenerateForm","Prompt","ProcessErrors","GetBasePath","RefreshTree","ParseTypeChange",function(h,m,k,g,c,p,f,e,l,a,d,b,z){return function(l){var h=l.inventory_id;l=void 0!==l.group_id?l.group_id:null;var k=null!==l?d("groups")+l+"/children/":d("inventory")+h+"/groups/",g=e.inject(f,{mode:"add",modal:!0,related:!1});g.formModalActionLabel="Save";g.formModalHeader="Create Group";
g.formModalCancelShow=!0;g.parseType="yaml";z(g);$("#form-modal .btn-none").removeClass("btn-none").addClass("btn-success");e.reset();g.$$phase||g.$digest();g.formModalAction=function(){try{if("json"==g.parseType){JSON.parse(g.variables);var d=g.variables}else d=jsyaml.load(g.variables);var e={},l;for(l in f.fields)"variables"!=l&&(e[l]=g[l]);h&&(e.inventory=h);c.setUrl(k);c.post(e).success(function(e,l,h,k){g.variables?(c.setUrl(e.related.variable_data),c.put(d).success(function(a,d,c,e){$("#form-modal").modal("hide");
b({scope:g})}).error(function(b,d,c,e){a(g,b,d,f,{hdr:"Error!",msg:"Failed to add group varaibles. PUT returned status: "+d})})):($("#form-modal").modal("hide"),b({scope:g}))}).error(function(b,d,c,e){a(g,b,d,f,{hdr:"Error!",msg:"Failed to add new group. POST returned status: "+d})})}catch(m){p("Error","Error parsing group variables. Parser returned: "+m)}};g.formReset=function(){e.reset()}}}]).factory("GroupsEdit",["$rootScope","$location","$log","$routeParams","Rest","Alert","GroupForm","GenerateForm",
"Prompt","ProcessErrors","GetBasePath","RefreshTree","ParseTypeChange",function(h,m,k,g,c,p,f,e,l,a,d,b,z){return function(l){var h=l.group_id,k=g.id,m=d("groups")+h+"/",t=e.inject(f,{mode:"edit",modal:!0,related:!1});e.reset();var s={},n={};t.formModalActionLabel="Save";t.formModalHeader="Edit Group";t.formModalCancelShow=!0;t.parseType="yaml";z(t);$("#form-modal .btn-none").removeClass("btn-none").addClass("btn-success");t.groupLoadedRemove&&t.groupLoadedRemove();t.groupLoadedRemove=t.$on("groupLoaded",
@ -283,9 +283,9 @@ fieldActions:{edit:{label:"Edit",ngClick:"editProject({{ project.id }})",icon:"i
icon:"icon-plus",mode:"all",ngClick:"addTeam()","class":"btn-success btn-small",awToolTip:"Create a new team"}},fieldActions:{edit:{label:"Edit",ngClick:"editTeam({{ team.id }})",icon:"icon-edit","class":"btn-small btn-success",awToolTip:"View/Edit team"},"delete":{label:"Delete",ngClick:"deleteTeam({{ team.id }},'{{ team.name }}')",icon:"icon-remove","class":"btn-small btn-danger",awToolTip:"Delete team"}}});angular.module("UserListDefinition",[]).value("UserList",{name:"users",iterator:"user",selectTitle:"Add Users",editTitle:"Users",selectInstructions:'Check the Select checkbox next to each user to be added, and click Finished when done. Use the green <i class="icon-plus"></i> button to create a new user.',index:!0,hover:!0,fields:{username:{key:!0,label:"Username"},first_name:{label:"First Name"},last_name:{label:"Last Name"}},actions:{add:{label:"Add",icon:"icon-plus",mode:"all",ngClick:"addUser()",
basePaths:["organizations","users"],"class":"btn-success btn-small",awToolTip:"Create a new user"}},fieldActions:{edit:{label:"Edit",ngClick:"editUser({{ user.id }})",icon:"icon-edit","class":"btn-small btn-success",awToolTip:"View/Edit user"},"delete":{label:"Delete",ngClick:"deleteUser({{ user.id }},'{{ user.username }}')",icon:"icon-remove","class":"btn-small btn-danger",awToolTip:"Delete user"}}});angular.module("ApiLoader",["ngCookies"]).factory("LoadBasePaths",["$http","$rootScope","$cookieStore","ProcessErrors",function(h,m,k,g){return function(){h.get("/api/").success(function(c,p,f,e){var l=c.current_version;h.get(l).success(function(a,c,b,e){a.base=l;m.defaultUrls=a;k.remove("api");k.put("api",a)}).error(function(a,c,b,e){m.defaultUrls={status:"error"};g(null,a,c,null,{hdr:"Error",msg:"Failed to read "+l+". GET status: "+c})})}).error(function(c,h,f,e){m.defaultUrls={status:"error"};
g(null,c,h,null,{hdr:"Error",msg:"Failed to read /api. GET status: "+h})})}}]).factory("GetBasePath",["$rootScope","$cookieStore","LoadBasePaths",function(h,m,k){return function(g){null==h.defaultUrls||void 0==h.defaultUrls?(g=m.get("api")[g],k()):g=h.defaultUrls[g];return g}}]);angular.module("AuthService",["ngCookies"]).factory("Authorization",["$http","$rootScope","$location","$cookieStore",function(h,m,k,g){return{setToken:function(c){var h=new Date;h.setTime(h.getTime()+1E3*$AnsibleConfig.session_timeout);g.remove("token");g.remove("token_expire");g.put("token",c);g.put("token_expire",h.getTime());m.userLoggedIn=!0},isTokenValid:function(){var c=!1;if(g.get("token")&&g.get("token_expire")){var h=g.get("token"),f=new Date(g.get("token_expire"));new Date<f&&(this.setToken(h),
c=!0)}return c},didSessionExpire:function(){var c=!1;g.get("token_expire")&&new Date(g.get("token_expire"))<new Date&&(c=!0);return c},getToken:function(){return this.isTokenValid()?g.get("token"):null},retrieveToken:function(c,g){return h({method:"POST",url:"/api/v1/authtoken/",data:{username:c,password:g}})},logout:function(){m.current_user={};g.remove("token");g.remove("token_expire");g.remove("current_user");m.userLoggedIn=!1},getLicense:function(){return h({method:"GET",url:"/api/v1/config/",
headers:{Authorization:"Token "+this.getToken()}})},setLicense:function(c){c.tested=!1;g.put("license",c)},licenseTested:function(){var c;c=void 0!==m.license_tested?m.license_tested:(c=g.get("license"))&&void 0!==c.tested?c.tested:!1;return c},getUser:function(){return h({method:"GET",url:"/api/v1/me/",headers:{Authorization:"Token "+this.getToken()}})},setUserInfo:function(c){m.current_user=c.results[0];g.put("current_user",c.results[0])},restoreUserInfo:function(){m.current_user=g.get("current_user")},
getUserInfo:function(c){return m.current_user[c]?m.current_user[c]:null}}}]);var INTEGER_REGEXP=/^\-?\d*$/;
c=!0)}return c},didSessionExpire:function(){var c=!1;g.get("token_expire")&&new Date(g.get("token_expire"))<new Date&&(c=!0);return c},getToken:function(){return this.isTokenValid()?g.get("token"):null},retrieveToken:function(c,g){return h({method:"POST",url:"/api/v1/authtoken/",data:{username:c,password:g}})},logout:function(){m.current_user={};m.license_tested=void 0;g.remove("token");g.remove("token_expire");g.remove("current_user");m.userLoggedIn=!1},getLicense:function(){return h({method:"GET",
url:"/api/v1/config/",headers:{Authorization:"Token "+this.getToken()}})},setLicense:function(c){c.tested=!1;g.put("license",c)},licenseTested:function(){var c;c=void 0!==m.license_tested?m.license_tested:(c=g.get("license"))&&void 0!==c.tested?c.tested:!1;return c},getUser:function(){return h({method:"GET",url:"/api/v1/me/",headers:{Authorization:"Token "+this.getToken()}})},setUserInfo:function(c){m.current_user=c.results[0];g.put("current_user",c.results[0])},restoreUserInfo:function(){m.current_user=
g.get("current_user")},getUserInfo:function(c){return m.current_user[c]?m.current_user[c]:null}}}]);var INTEGER_REGEXP=/^\-?\d*$/;
angular.module("AWDirectives",["RestServices"]).directive("awpassmatch",function(){return{require:"ngModel",link:function(h,m,k,g){g.$parsers.unshift(function(c){var h=$('input[name="'+k.awpassmatch+'"]').val();if(c==h)return g.$setValidity("awpassmatch",!0),c;g.$setValidity("awpassmatch",!1)})}}}).directive("capitalize",function(){return{require:"ngModel",link:function(h,m,k,g){g.$parsers.unshift(function(c){var h=c.split(" "),f="";for(i=0;i<h.length;i++)f+=h[i].charAt(0).toUpperCase()+h[i].substr(1)+
" ";f=f.trim();f!=c&&(g.$setViewValue(f),g.$render());return f})}}}).directive("integer",function(){return{require:"ngModel",link:function(h,m,k,g){g.$parsers.unshift(function(c){g.$setValidity("min",!0);g.$setValidity("max",!0);if(INTEGER_REGEXP.test(c)){g.$setValidity("integer",!0);if(m.attr("min")&&(""==c||null==c||parseInt(c)<parseInt(m.attr("min")))){g.$setValidity("min",!1);return}if(m.attr("max")&&parseInt(c)>parseInt(m.attr("max"))){g.$setValidity("max",!1);return}return c}g.$setValidity("integer",
!1)})}}}).directive("awRequiredWhen",function(){return{require:"ngModel",link:function(h,m,k,g){function c(){var c=m.val();validity=!0;h[k.awRequiredWhen]&&(null==m.attr("required")||void 0==m.attr("required"))?$(m).attr("required","required"):h[k.awRequiredWhen]||m.removeAttr("required");if(h[k.awRequiredWhen]&&(void 0==c||null==c||""==c))validity=!1;g.$setValidity("required",validity)}h[k.awRequiredWhen]=k.awrequiredInit;c();h.$watch(k.awRequiredWhen,function(){c()});h.$watch($(m).attr("name"),
@ -342,9 +342,9 @@ d.related[b].iterator+'Loading == true">\n';html+='<td colspan="'+m+'"><div clas
'<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;switch(m){case "ngClick":k='ng-click="'+h[m]+'" ';break;case "ngOptions":k='ng-options="'+h[m]+'" ';break;case "ngClass":k='ng-class="'+h[m]+'" ';break;case "ngChange":k='ng-change="'+h[m]+'" ';break;case "ngDisabled":k='ng-disabled="'+h[m]+'" ';break;case "ngShow":k='ng-show="'+h[m]+'" ';break;case "ngHide":k='ng-hide="'+h[m]+'" ';break;case "ngBind":k='ng-bind="'+h[m]+'" ';break;case "trueValue":k=
'ng-true-value="'+h[m]+'" ';break;case "falseValue":k='ng-false-value="'+h[m]+'" ';break;case "awToolTip":k='aw-tool-tip="'+h[m]+'" ';break;case "awPopOver":k="aw-pop-over='"+h[m]+"' ";break;case "dataTitle":k='data-title="'+h[m]+'" ';break;case "dataPlacement":k='data-placement="'+h[m]+'" ';break;case "dataContainer":k='data-container="'+h[m]+'" ';break;default:k=m+'="'+h[m]+'" '}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> ");
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&&
(e+="</span>");if((f.key||f.link||f.linkTo||f.ngClick)&&"lookup"!=p.mode&&"select"!=p.mode)e+="</a>";e+=f.ngShow?"</span>":"";e+=f.appendHTML?'<div ng-show="'+f.appendHTML+' !== null" ng-bind-html-unsafe="'+f.appendHTML+'" style="padding-left: {{ '+g.iterator+'.spaces + 12 }}px" ></div>\n':"";return e+"</td>\n"}}]).factory("SearchWidget",function(){return function(h){var m=h.iterator,k=h.template,g=h.mini;h=h.label?h.label:null;h='<div class="search-widget">\n'+(h?"<label>"+h+"</label>":"");h+='<div class="input-prepend input-append">\n';
h+='<div class="btn-group">\n';h+='<button class="btn ';h+=g?"btn-mini ":"btn-small";h+='dropdown-toggle" data-toggle="dropdown">\n';h+='<span ng-bind="'+m+'SearchFieldLabel"></span>\n';h+='<span class="caret"></span>\n';h+="</button>\n";h+='<ul class="dropdown-menu" id="'+m+'SearchDropdown">\n';for(var c in k.fields)if(void 0==k.fields[c].searchable||!0==k.fields[c].searchable)h+='<li><a href="" ng-click="setSearchField(\''+m+"','",h+=c+"','"+k.fields[c].label+"')\">"+k.fields[c].label+"</a></li>\n";
@ -365,8 +365,8 @@ for(action in d.fieldActions)a+='<button class="btn',a+=d.fieldActions[action]["
"",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)m("Access Denied","The API responded with a 403 Access Denied error. You do not have permission to perform the requested action. Please contact a system administrator.");
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&&f&&m(f.hdr,f.msg)}else m(f.hdr,f.msg)}}]).factory("LoadBreadCrumbs",["$rootScope",
"$routeParams","$location",function(h,m,k,g){return function(c){if(null!==c&&void 0!==c){for(var g=!1,f=0;f<h.crumbCache.length;f++)if(h.crumbCache[f].path==c.path){g=!0;h.crumbCache[f]=c;break}!1==g&&h.crumbCache.push(c)}c=k.path().replace(/^\//,"").split("/");g="";h.breadcrumbs=[];if(1<c.length)for(var e,l,f=0;f<c.length-1;f++){if(0<f&&c[f].match(/\d+/)){e=c[f-1];l="inventories"==e?"inventory":e.substring(0,e.length-1);for(var a=0;a<h.crumbCache.length;a++)if(h.crumbCache[a].path=="/"+e+"/"+c[f]){l=
h.crumbCache[a].title;break}h.breadcrumbs.push({title:l,path:g+"/"+c[f]})}else h.breadcrumbs.push({title:c[f],path:g+"/"+c[f]});g+="/"+c[f]}}}]).factory("ReturnToCaller",["$location",function(h){return function(m){var k=h.path().replace(/^\//,"").split("/"),g="";m=null==m||void 0==m?k.length-1:m+1;for(var c=0;c<m;c++)g+="/"+k[c];h.path(g)}}]).factory("FormatDate",[function(){return function(h){var m=h.getFullYear()+"-",m=m+(("0"+(h.getMonth()+1)).slice(-2)+"-"),m=m+(("0"+h.getDate()).slice(-2)+" "),
m=m+(("0"+h.getHours()).slice(-2)+":"),m=m+(("0"+h.getMinutes()).slice(-2)+":"),m=m+(("0"+h.getSeconds()).slice(-2)+":");return m+=("000"+h.getMilliseconds()).slice(-3)}}]);
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&&
f&&m(f.hdr,f.msg)}else m(f.hdr,f.msg)}}]).factory("LoadBreadCrumbs",["$rootScope","$routeParams","$location",function(h,m,k,g){return function(c){if(null!==c&&void 0!==c){for(var g=!1,f=0;f<h.crumbCache.length;f++)if(h.crumbCache[f].path==c.path){g=!0;h.crumbCache[f]=c;break}!1==g&&h.crumbCache.push(c)}c=k.path().replace(/^\//,"").split("/");g="";h.breadcrumbs=[];if(1<c.length)for(var e,l,f=0;f<c.length-1;f++){if(0<f&&c[f].match(/\d+/)){e=c[f-1];l="inventories"==e?"inventory":e.substring(0,e.length-
1);for(var a=0;a<h.crumbCache.length;a++)if(h.crumbCache[a].path=="/"+e+"/"+c[f]){l=h.crumbCache[a].title;break}h.breadcrumbs.push({title:l,path:g+"/"+c[f]})}else h.breadcrumbs.push({title:c[f],path:g+"/"+c[f]});g+="/"+c[f]}}}]).factory("ReturnToCaller",["$location",function(h){return function(m){var k=h.path().replace(/^\//,"").split("/"),g="";m=null==m||void 0==m?k.length-1:m+1;for(var c=0;c<m;c++)g+="/"+k[c];h.path(g)}}]).factory("FormatDate",[function(){return function(h){var m=h.getFullYear()+
"-",m=m+(("0"+(h.getMonth()+1)).slice(-2)+"-"),m=m+(("0"+h.getDate()).slice(-2)+" "),m=m+(("0"+h.getHours()).slice(-2)+":"),m=m+(("0"+h.getMinutes()).slice(-2)+":"),m=m+(("0"+h.getSeconds()).slice(-2)+":");return m+=("000"+h.getMilliseconds()).slice(-3)}}]);

View File

@ -63,6 +63,7 @@ angular.module('AuthService', ['ngCookies'])
logout: function() {
$rootScope.current_user = {};
$rootScope.license_tested = undefined;
$cookieStore.remove('token');
$cookieStore.remove('token_expire');
$cookieStore.remove('current_user');

View File

@ -12,54 +12,55 @@ angular.module('GeneratorHelpers', ['GeneratorHelpers'])
.factory('Attr', function() {
return function(obj, key) {
var result;
var value = (typeof obj[key] === "string") ? obj[key].replace(/\'/g, '&quot;') : obj[key];
switch(key) {
case 'ngClick':
result = "ng-click=\"" + obj[key] + "\" ";
result = "ng-click=\"" + value + "\" ";
break;
case 'ngOptions':
result = "ng-options=\"" + obj[key] + "\" ";
result = "ng-options=\"" + value + "\" ";
break;
case 'ngClass':
result = "ng-class=\"" + obj[key] + "\" ";
result = "ng-class=\"" + value + "\" ";
break;
case 'ngChange':
result = "ng-change=\"" + obj[key] + "\" ";
result = "ng-change=\"" + value + "\" ";
break;
case 'ngDisabled':
result = "ng-disabled=\"" + obj[key] + "\" ";
result = "ng-disabled=\"" + value + "\" ";
break;
case 'ngShow':
result = "ng-show=\"" + obj[key] + "\" ";
result = "ng-show=\"" + value + "\" ";
break;
case 'ngHide':
result = "ng-hide=\"" + obj[key] + "\" ";
result = "ng-hide=\"" + value + "\" ";
break;
case 'ngBind':
result = "ng-bind=\"" + obj[key] + "\" ";
result = "ng-bind=\"" + value + "\" ";
break;
case 'trueValue':
result = "ng-true-value=\"" + obj[key] + "\" ";
result = "ng-true-value=\"" + value + "\" ";
break;
case 'falseValue':
result = "ng-false-value=\"" + obj[key] + "\" ";
result = "ng-false-value=\"" + value + "\" ";
break;
case 'awToolTip':
result = "aw-tool-tip=\"" + obj[key] + "\" ";
result = "aw-tool-tip=\"" + value + "\" ";
break;
case 'awPopOver':
result = "aw-pop-over='" + obj[key] + "' ";
result = "aw-pop-over='" + value + "' ";
break;
case 'dataTitle':
result = "data-title=\"" + obj[key] + "\" ";
result = "data-title=\"" + value + "\" ";
break;
case 'dataPlacement':
result = "data-placement=\"" + obj[key] + "\" ";
result = "data-placement=\"" + value + "\" ";
break;
case 'dataContainer':
result = "data-container=\"" + obj[key] + "\" ";
result = "data-container=\"" + value + "\" ";
break;
default:
result = key + "=\"" + obj[key] + "\" ";
result = key + "=\"" + value + "\" ";
}
return result;

View File

@ -63,8 +63,15 @@ angular.module('Utilities',[])
.factory('ProcessErrors', ['$log', 'Alert', function($log, Alert) {
return function(scope, data, status, form, defaultMsg) {
if (status == 403) {
Alert('Access Denied', 'The API responded with a 403 Access Denied error. You do not have permission to perform the ' +
'requested action. Please contact a system administrator.');
var msg = 'The API responded with a 403 Access Denied error. You do not have permission to perform the ' +
'requested action. ';
if (data['detail']) {
msg += 'Detail: ' + data['detail'];
}
else {
msg += 'Please contact your system administrator.';
}
Alert('Access Denied', msg);
}
else if (data.non_field_errors) {
Alert('Error!', data.non_field_errors);