AC-202 Missing detail buttons -job events page is now responsive to small screen sizes. On phone/tablet size screen Host column disappears and host name shows in the Event column as part of the detail. Also added media querries in CSS to adjust the table formatting and make things fit. Fixed issues with the JSON modal dialog so that everything fits on a portrait size mobile phone.

This commit is contained in:
chouseknecht 2013-07-10 13:45:44 -04:00
parent f4bba01271
commit 7fcb4e0e0b
7 changed files with 137 additions and 59 deletions

View File

@ -347,7 +347,7 @@
background-color: #fff;
}
/* Jobs page */
.job-error, .job-failed,
@ -410,6 +410,20 @@
cursor: default;
}
.level-1 {
padding-left: 24px;
}
.level-2 {
padding-left: 48px;
}
.level-3 {
padding-left: 72px;
}
.level-3-detail {
padding-left: 72px;
}
/* End Jobs Page */
@ -525,41 +539,39 @@
padding-top: 0;
}
#event_display-header {
min-width: 250px;
.event-form {
margin-top: 10px;
margin-bottom: 5px;
}
#job-event-host-header {
min-width: 200px;
}
.event-detail {
margin-top: 15px;
.event-detail-host {
padding-top: 10px;
padding-bottom: 5px;
}
/* form displayed in modal window */
.horizontal-narrow .control-label {
float: left;
width: 120px;
padding-top: 5px;
text-align: right;
}
.horizontal-narrow .control-label {
float: left;
width: 120px;
padding-top: 5px;
text-align: right;
}
.horizontal-narrow .controls {
*display: inline-block;
*padding-left: 20px;
margin-left: 140px;
*margin-left: 0;
}
.horizontal-narrow .controls {
*display: inline-block;
*padding-left: 20px;
margin-left: 140px;
*margin-left: 0;
}
.horizontal-narrow .controls:first-child {
*padding-left: 140px;
}
.horizontal-narrow .controls:first-child {
*padding-left: 140px;
}
.modal-input-xlarge {
.modal-input-xlarge {
width: 350px;
}
}
/* overrides to TB modal */
@ -601,3 +613,57 @@
#prompt-modal .modal-body {
padding-bottom: 30px;
}
/* Large desktop */
@media (min-width: 1200px) {
}
/* Portrait tablet to landscape and desktop */
@media (min-width: 768px) and (max-width: 979px) {
body {
padding-top: 0px;
}
}
/* Landscape phone to portrait tablet */
@media (max-width: 767px) {
body {
padding-top: 0px;
}
}
/* Landscape phones and down */
@media (max-width: 480px) {
body {
padding-top: 0px;
}
/* Job events */
.level-1, .level-2, .level-3, .level-3-detail {
padding-left: 0;
}
table {
table-layout: fixed;
word-wrap: break-word;
}
/* form displayed in modal window */
.horizontal-narrow .control-label {
width: 105px;
}
.horizontal-narrow .controls {
margin-left: 125px;
}
.horizontal-narrow .controls:first-child {
*padding-left: 125px;
}
.modal-input-xlarge {
width: 200px;
}
}

View File

@ -4,7 +4,7 @@
*
* awx-min.js
*
* master-e3d0344, Tue Jul 9 15:40:33 2013 -0400
* master-0036515, Tue Jul 9 17:07:02 2013 -0400
*
*/
var urlPrefix="/static/";
@ -55,8 +55,9 @@ y.$$phase||y.$digest()});y.addGroup=function(){q({inventory_id:I,group_id:y.grou
inventory_id:I,group_id:y.group_id,host_id:a,host_name:b})};y.showEvents=function(a,c){l.setUrl(c);l.get().success(function(d,c,f,e){b({path:"/jobs/"+d.id,title:d.name});g.url("/jobs/"+d.id+"/job_events/?host="+escape(a))}).error(function(a,b,e,l){d(y,a,b,f,{hdr:"Error!",msg:"Failed to lookup last job: "+c+". GET status: "+b})})}}InventoriesEdit.$inject="$scope $rootScope $compile $location $log $routeParams InventoryForm GenerateForm Rest Alert ProcessErrors LoadBreadCrumbs RelatedSearchInit RelatedPaginateInit ReturnToCaller ClearScope LookUpInit Prompt OrganizationList TreeInit GetBasePath GroupsList GroupsEdit LoadInventory GroupsDelete HostsList HostsAdd HostsEdit HostsDelete RefreshTree ParseTypeChange".split(" ");function JobEventsList(h,m,k,g,c,p,f,e,l,a,d,b,z,w,B,u,x,t,s,n,C){B("htmlTemplate");e.base=k.path();h=x("jobs")+c.id+"/job_events/";k.path().replace(/^\//,"").split("/");var q=l.inject(e,{mode:"edit"});m.flashMessage=null;q.selected=[];q.expand=!0;q.parentNode="parent-event";q.childNode="child-event";q.RemovePostRefresh&&q.RemovePostRefresh();q.RemovePostRefresh=q.$on("PostRefresh",function(){for(var a=q[e.name],b,d=0;d<a.length;d++){a[d].event_display=a[d].event_display.replace(/^\u00a0*/g,"");if(3>
a[d].event_level)a[d].ngclick="toggleChildren("+a[d].id+', "'+a[d].related.children+'")',a[d].ngicon="icon-collapse-alt",a[d]["class"]="parentNode";else{a[d]["class"]="childNode";b=a[d];var c=a[d].event_data,f="";if(c.res){var l=!1,n=void 0,n=void 0;if("string"==typeof c.res)n=(n=c.res.match(/\n/g))?n.length:1,l=!0,f+="<label>Traceback:</label>\n",f+='<textarea readonly class="input-xxlarge" rows="'+n+'">'+c.res+"</textarea>\n";else{var k=void 0;for(k in c.res){if(("msg"==k||"stdout"==k||"stderr"==
k)&&null!==c.res[k]&&""!==c.res[k]){f+="<label>";switch(k){case "msg":case "stdout":f+="Output:";break;case "stderr":f+="Error:"}f+="</label>\n";n=(n=c.res[k].match(/\n/g))?n.length:1;f+='<textarea readonly class="input-xxlarge" rows="'+n+'">'+c.res[k]+"</textarea>\n";l=!0}if("results"==k&&Array.isArray(c.res[k])&&0<c.res[k].length){f+="<label>Results:</label>\n";l="";for(n=0;n<c.res[k].length;n++)l+=c.res[k][n];f+='<textarea readonly class="input-xxlarge" rows="'+n+'">'+l+"</textarea>\n";l=!0}"rc"==
k&&0!=c.res[k]&&(f+="<label>Return Code:</label>\n",f+='<input type="text" value="'+c.res[k]+'" readonly >\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(" ");
k&&0!=c.res[k]&&(f+="<label>Return Code:</label>\n",f+='<input type="text" class="input-mini" value="'+c.res[k]+'" readonly >\n',l=!0)}}f=l?'<form class="event-form">\n'+f+"</form>\n":""}f=c.host?'<span class="event-detail-host visible-phone visible-tablet">'+c.host+"</span>\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,
b,c,e){d(u,a,b,f,{hdr:"Error!",msg:"Failed to retrieve event detail: "+p.event_id+". GET status: "+b})})}JobEventsEdit.$inject="$scope $rootScope $compile $location $log $routeParams JobEventForm GenerateForm Rest Alert ProcessErrors LoadBreadCrumbs ClearScope GetBasePath FormatDate".split(" ");function JobHostSummaryList(h,m,k,g,c,p,f,e,l,a,d,b,z,w,B,u,x){B("htmlTemplate");h=x("jobs")+c.id+"/job_host_summaries/";k.path().replace(/^\//,"").split("/");var t=l.inject(e,{mode:"edit"});t.selected=[];t.PostRefreshRemove&&t.PostRefreshRemove();t.PostRefershRemove=t.$on("PostRefresh",function(){for(var a=0;a<t.jobhosts.length;a++)t.jobhosts[a].host_name=t.jobhosts[a].summary_fields.host.name,t.jobhosts[a].status=t.jobhosts[a].failed?"error":"success"});b({scope:t,set:"jobhosts",list:e,url:h});
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")}}
@ -266,9 +267,9 @@ icon:"icon-edit",label:"Edit","class":"btn-small btn-success",awToolTip:"View/Ed
dataPlacement:"left",dataContainer:"#form-modal",icon:"icon-question-sign",mode:"all","class":"btn-small btn-info",awToolTip:"Click for help",dataTitle:"Adding Groups"}},fieldActions:{edit:{label:"Edit",ngClick:"editGroup({{ group.id }})",icon:"icon-edit","class":"btn-small btn-success",awToolTip:"View/Edit group"},"delete":{label:"Delete",ngClick:"deleteGroup({{ group.id }},'{{ group.name }}')",icon:"icon-remove","class":"btn-small btn-danger",awToolTip:"Delete group"}}});angular.module("HostListDefinition",[]).value("HostList",{name:"hosts",iterator:"host",selectTitle:"Select Host",editTitle:"Hosts",index:!0,well:!0,fields:{name:{key:!0,label:"Host Name",linkTo:"/inventories/{{ inventory_id }}/hosts/{{ host.id }}"},description:{label:"Description"}},actions:{help:{awPopOver:"Select hosts by clicking on each host you wish to add. Add the selected hosts to the group by clicking the Select button.",dataPlacement:"left",dataContainer:"#form-modal",icon:"icon-question-sign",
mode:"all","class":"btn-small btn-info",awToolTip:"Click for help",dataTitle:"Selecting Hosts"}},fieldActions:{edit:{label:"Edit",ngClick:"editHost({{ host.id }})",icon:"icon-edit","class":"btn-small btn-success",awToolTip:"View/Edit host"},"delete":{label:"Delete",ngClick:"deleteHost({{ host.id }},'{{ host.name }}')",icon:"icon-remove","class":"btn-small btn-danger",awToolTip:"Delete host"}}});angular.module("InventoriesListDefinition",[]).value("InventoryList",{name:"inventories",iterator:"inventory",selectTitle:"Add Inventories",editTitle:"Inventories",selectInstructions:'Click on a row to select it, and click Finished when done. Use the green <i class="icon-plus"></i> button to create a new row.',index:!0,hover:!0,fields:{name:{key:!0,label:"Name"},description:{label:"Descriptions"},organization:{label:"Organization",ngBind:"inventory.summary_fields.organization.name",sourceModel:"organization",
sourceField:"name"},has_active_failures:{label:"Failed Jobs?",showValue:!1,text:"View failures",ngShow:"{{ inventory.has_active_failures }}",icon:"icon-exclamation-sign","class":"active-failures-{{ inventory.has_active_failures }}",ngClick:"viewJobs({{ inventory.id }})",searchField:"has_active_failures",searchType:"boolean",searchOptions:[{name:"No",value:0},{name:"Yes",value:1}],excludeModal:!0}},actions:{add:{label:"Add",icon:"icon-plus",mode:"all",ngClick:"addInventory()","class":"btn-small btn-success",
awToolTip:"Create a new inventory"}},fieldActions:{edit:{label:"Edit",ngClick:"editInventory({{ inventory.id }})",icon:"icon-edit","class":"btn-small btn-success",awToolTip:"View/Edit inventory"},"delete":{label:"Delete",ngClick:"deleteInventory({{ inventory.id }},'{{ inventory.name }}')",icon:"icon-remove","class":"btn-small btn-danger",awToolTip:"Delete inventory"}}});angular.module("JobEventsListDefinition",[]).value("JobEventList",{name:"jobevents",iterator:"jobevent",editTitle:"Job Events",index:!1,hover:!0,hasChildren:!0,filterBy:"{ show: true }",fields:{created:{label:"Date",key:!0,nosort:!0,searchable:!1,link:!1},status:{label:"Status",icon:"icon-circle","class":"job-{{ jobevent.status }}",searchField:"failed",searchType:"boolean",searchOptions:[{name:"success",value:0},{name:"error",value:1}],nosort:!0,searchable:!1},event_display:{label:"Event",hasChildren:!0,
ngClick:"toggleChildren({{ jobevent.id }}, '{{ jobevent.related.children }}')",nosort:!0,searchable:!1,ngClass:"{{ jobevent.class }}",appendHTML:"jobevent.event_detail"},host:{label:"Host",ngBind:"jobevent.summary_fields.host.name",searchField:"hosts__name",nosort:!0,id:"job-event-host-header"}},actions:{refresh:{ngClick:"refresh()",icon:"icon-refresh",label:"Refresh",awToolTip:"Refresh the page","class":"btn-small btn-success",mode:"all"},edit:{label:"Details",ngClick:"jobDetails()",icon:"icon-zoom-in",
"class":"btn btn-small",awToolTip:"Edit job details",mode:"all"},summary:{label:"Hosts",icon:"icon-th-large",ngClick:"jobSummary()","class":"btn btn-small",awToolTip:"View host summary",mode:"all"}},fieldActions:{edit:{label:"View",ngClick:"viewJobEvent({{ jobevent.id }})",icon:"icon-zoom-in","class":"btn-small",awToolTip:"View event details"}}});angular.module("JobHostDefinition",[]).value("JobHostList",{name:"jobhosts",iterator:"jobhost",editTitle:"Job Host Summary",index:!0,hover:!0,fields:{host:{label:"Host",key:!0,sourceModel:"host",sourceField:"name",ngBind:"jobhost.host_name",ngClick:"showEvents('{{ jobhost.summary_fields.host.name }}','{{ jobhost.related.job }}')"},status:{label:"Status",icon:"icon-circle","class":"job-{{ jobhost.status }}",searchField:"failed",searchType:"boolean",searchOptions:[{name:"success",value:0},{name:"error",
awToolTip:"Create a new inventory"}},fieldActions:{edit:{label:"Edit",ngClick:"editInventory({{ inventory.id }})",icon:"icon-edit","class":"btn-small btn-success",awToolTip:"View/Edit inventory"},"delete":{label:"Delete",ngClick:"deleteInventory({{ inventory.id }},'{{ inventory.name }}')",icon:"icon-remove","class":"btn-small btn-danger",awToolTip:"Delete inventory"}}});angular.module("JobEventsListDefinition",[]).value("JobEventList",{name:"jobevents",iterator:"jobevent",editTitle:"Job Events",index:!1,hover:!0,hasChildren:!0,filterBy:"{ show: true }",fields:{created:{label:"Date",key:!0,nosort:!0,searchable:!1,link:!1},status:{label:"Status",icon:"icon-circle",showValue:!0,"class":"job-{{ jobevent.status }}",searchField:"failed",searchType:"boolean",searchOptions:[{name:"success",value:0},{name:"error",value:1}],nosort:!0,searchable:!1},event_display:{label:"Event",
hasChildren:!0,ngClick:"toggleChildren({{ jobevent.id }}, '{{ jobevent.related.children }}')",nosort:!0,searchable:!1,ngClass:"{{ jobevent.class }}",appendHTML:"jobevent.event_detail"},host:{label:"Host",ngBind:"jobevent.summary_fields.host.name",searchField:"hosts__name",nosort:!0,searchOnly:!1,id:"job-event-host-header",columnClass:"hidden-phone hidden-tablet"}},actions:{refresh:{ngClick:"refresh()",icon:"icon-refresh",label:"Refresh",awToolTip:"Refresh the page","class":"btn-small btn-success",
mode:"all"},edit:{label:"Details",ngClick:"jobDetails()",icon:"icon-zoom-in","class":"btn btn-small",awToolTip:"Edit job details",mode:"all"},summary:{label:"Hosts",icon:"icon-th-large",ngClick:"jobSummary()","class":"btn btn-small",awToolTip:"View host summary",mode:"all"}},fieldActions:{edit:{label:"View",ngClick:"viewJobEvent({{ jobevent.id }})",icon:"icon-zoom-in","class":"btn-small",awToolTip:"View event details"}}});angular.module("JobHostDefinition",[]).value("JobHostList",{name:"jobhosts",iterator:"jobhost",editTitle:"Job Host Summary",index:!0,hover:!0,fields:{host:{label:"Host",key:!0,sourceModel:"host",sourceField:"name",ngBind:"jobhost.host_name",ngClick:"showEvents('{{ jobhost.summary_fields.host.name }}','{{ jobhost.related.job }}')"},status:{label:"Status",icon:"icon-circle","class":"job-{{ jobhost.status }}",searchField:"failed",searchType:"boolean",searchOptions:[{name:"success",value:0},{name:"error",
value:1}]},ok:{label:"Success",searchable:!1},changed:{label:"Changed",searchable:!1},failures:{label:"Failure",searchType:"gtzero"},dark:{label:"Unreachable",searchable:!1},skipped:{label:"Skipped",searchable:!1}},actions:{refresh:{label:"Refresh",icon:"icon-refresh",ngClick:"refresh()","class":"btn-success btn-small",awToolTip:"Refresh the page",mode:"all"},edit:{label:"Details",icon:"icon-edit",ngClick:"jobDetails()","class":"btn btn-small",awToolTip:"Edit job details",mode:"all"},events:{label:"Events",
icon:"icon-list-ul",ngClick:"jobEvents()","class":"btn btn-small",awToolTip:"View job events",mode:"all"}},fieldActions:{}});angular.module("JobsListDefinition",[]).value("JobList",{name:"jobs",iterator:"job",editTitle:"Jobs",index:!1,hover:!0,"class":"jobs-table",fields:{id:{label:"Job ID",key:!0,desc:!0,searchType:"int"},inventory:{label:"Inventory ID",searchType:"int",searchOnly:!0},name:{label:"Name",link:!0},created:{label:"Date",link:!0,searchable:!1},status:{label:"Status",icon:"icon-circle","class":"job-{{ job.status }}",searchType:"select",searchOptions:[{name:"new",value:"new"},{name:"pending",value:"pending"},
{name:"running",value:"running"},{name:"successful",value:"successful"},{name:"error",value:"error"},{name:"failed",value:"failed"},{name:"canceled",value:"canceled"}]}},actions:{refresh:{label:"Refresh","class":"btn-success btn-small",ngClick:"refreshJob({{ job.id }})",icon:"icon-refresh",awToolTip:"Refresh the page",mode:"all"}},fieldActions:{summary:{label:"Hosts",icon:"icon-th-large",ngClick:"viewSummary({{ job.id }}, '{{ job.name }}')","class":"btn btn-small",awToolTip:"View host summary",ngDisabled:"job.status == 'new'"},
@ -345,30 +346,30 @@ d.related[b].iterator+"Page * "+d.related[b].iterator+"PageSize) + 1 }}.</td>\n"
'data-placement="top" ':"",html+=">"+this.icon(k.icon),html+=k.label?" "+k.label:"",html+="</button> ";html+="</td>";html+="</tr>\n";html+='<tr class="info" ng-show="'+d.related[b].iterator+"Loading == false && ("+b+" == null || "+b+'.length == 0)">\n';html+='<td colspan="'+p+'"><div class="alert alert-info">No records matched your search.</div></td>\n';html+="</tr>\n";html+='<tr class="info" ng-show="'+d.related[b].iterator+'Loading == true">\n';html+='<td colspan="'+p+'"><div class="alert alert-info">Loading...</div></td>\n';
html+="</tr>\n";html+="</tbody>\n";html+="</table>\n";html+="</div>\n";html+="</div>\n";html+=c({set:b,iterator:d.related[b].iterator,mini:!0});html+="</div>\n";a++}html+="</div>\n";return html+="</div>\n"}}}]);angular.module("GeneratorHelpers",["GeneratorHelpers"]).factory("Attr",function(){return function(h,m){var k;k="string"===typeof h[m]?h[m].replace(/\'/g,"&quot;"):h[m];switch(m){case "ngClick":k='ng-click="'+k+'" ';break;case "ngOptions":k='ng-options="'+k+'" ';break;case "ngClass":k='ng-class="'+k+'" ';break;case "ngChange":k='ng-change="'+k+'" ';break;case "ngDisabled":k='ng-disabled="'+k+'" ';break;case "ngShow":k='ng-show="'+k+'" ';break;case "ngHide":k='ng-hide="'+k+'" ';break;case "ngBind":k=
'ng-bind="'+k+'" ';break;case "trueValue":k='ng-true-value="'+k+'" ';break;case "falseValue":k='ng-false-value="'+k+'" ';break;case "awToolTip":k='aw-tool-tip="'+k+'" ';break;case "awPopOver":k="aw-pop-over='"+k+"' ";break;case "dataTitle":k='data-title="'+k+'" ';break;case "dataPlacement":k='data-placement="'+k+'" ';break;case "dataContainer":k='data-container="'+k+'" ';break;default:k=m+'="'+k+'" '}return k}}).factory("Icon",function(){return function(h){return'<i class="'+h+'"></i> '}}).factory("Column",
["Attr","Icon",function(h,m){return function(k){var g=k.list,c=k.fld,p=k.options;k=k.base;var f=g.fields[c],e;e="<td "+('<td class="'+c+"-column");e+=f["class"]?" "+f["class"]:"";e+='" ';e+=f.ngClass?h(f,"ngClass"):"";e+=">\n";e+=f.ngShow?"<span "+h(f,"ngShow")+">":"";g.hasChildren&&f.hasChildren&&(e+='<span style="padding-left: {{ '+g.iterator+'.spaces }}px"><a href="" ng-click="{{ '+g.iterator+'.ngclick }}"> <i class="{{ '+g.iterator+'.ngicon }}" ng-show="\'{{ '+g.iterator+".related.children }}' !== ''\" ></i></a> ");
if((f.key||f.link||f.linkTo||f.ngClick)&&"lookup"!=p.mode&&"select"!=p.mode)if(f.linkTo)e+='<a href="#'+f.linkTo+'">';else if(f.ngClick)e+='<a href=""'+h(f,"ngClick")+'">';else if(void 0==f.link||f.link)e+='<a href="#/'+k+"/{{"+g.iterator+'.id }}">';f.ngShowIcon?e+='<i ng-show="'+f.ngShowIcon+'" class="'+f.icon+'"></i> ':f.icon&&(e+=m(f.icon)+" ");if(void 0==f.showValue||!0==f.showValue)e=f.ngBind?e+("{{ "+f.ngBind+" }}"):e+("{{"+g.iterator+"."+c+"}}");f.text&&(e+=f.text);g.hasChildren&&f.hasChildren&&
(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";
h+="</ul>\n";h+="</div>\n";h+='<select ng-show="'+m+'SelectShow" ng-model="'+m+'SearchSelectValue" ng-change="search(\''+m+"')\" ";h+='ng-options="c.name for c in '+m+'SearchSelectOpts" class="search-select';h+=g?" field-mini-height":"";h+='"></select>\n';h+='<input ng-hide="'+m+"SelectShow || "+m+'InputHide" class="input-medium';h+=g?" field-mini-height":"";h+='" ng-model="'+m+'SearchValue" ng-change="search(\''+m+'\')" placeholder="Search" type="text" >\n';h+='<div class="btn-group">\n';h+='<button ng-hide="'+
m+"SelectShow || "+m+"HideSearchType || "+m+'InputHide" class="btn ';h+=g?"btn-mini ":"btn-small";h+='dropdown-toggle" data-toggle="dropdown">\n';h+='<span ng-bind="'+m+'SearchTypeLabel"></span>\n';h+='<span class="caret"></span>\n';h+="</button>\n";h+='<ul class="dropdown-menu">\n';h+='<li><a href="" ng-click="setSearchType(\''+m+"','iexact','Exact Match')\">Exact Match</a></li>\n";h+='<li><a href="" ng-click="setSearchType(\''+m+"','icontains','Contains')\">Contains</a></li>\n";h+="</ul>\n";h+=
"</div>\n";h+="</div>\n";h+='<div class="spin"><i class="icon-spinner icon-spin" ng-show="'+m+'SearchSpin == true"></i></div>\n';return h+="</div>\n"}}).factory("PaginateWidget",function(){return function(h){var m=h.set,k=h.iterator,g=h.mini;h=h.mode?h.mode:null;var c="",c=("lookup"==h?c+'<div class="lookup-navigation':c+'<div class="footer-navigation')+(g?" related-footer":""),c=c+'">\n',c=c+'<form class="form-inline">\n',c=c+'<button class="previous btn',c=c+(g?' btn-mini" ':'" '),c=c+("ng-click=\"prevSet('"+
m+"','"+k+'\')" ng-disabled="'+k+"PrevUrl == null || "+k+'PrevUrl == undefined"><i class="icon-chevron-left"></i> Prev</button>\n'),c=c+'<button class="next btn btn',c=c+(g?' btn-mini" ':'" '),c=c+(" ng-click=\"nextSet('"+m+"','"+k+'\')"ng-disabled="'+k+"NextUrl == null || "+k+'NextUrl == undefined">Next <i class="icon-chevron-right"></i></button>\n');"lookup"!=h&&(c+='<label class="page-size-label">Rows per page:</label>\n',c+='<select ng-model="'+k+'PageSize" ng-change="changePageSize(\''+m+"','"+
k+'\')" class="input-mini',c+=g?" field-mini-height":"",c+=' page-size">\n',c+='<option value="10" selected>10</option>\n',c+='<option value="20" selected>20</option>\n',c+='<option value="40">40</option>\n',c+='<option value="60">60</option>\n',c+='<option value="80">80</option>\n',c+="</select>\n");c+='<div class="page-number-small" ng-show="'+k+'PageCount > 0" ';c+=">Page: {{ "+k+"Page + 1 }} of {{ "+k+"PageCount }}</div>\n";c+="</form>\n";return c+="</div>\n"}});angular.module("ListGenerator",["GeneratorHelpers"]).factory("GenerateList",["$location","$compile","$rootScope","SearchWidget","PaginateWidget","Attr","Icon","Column",function(h,m,k,g,c,p,f,e){return{setList:function(c){this.list=c},attr:p,icon:f,has:function(c){return this.form[c]&&null!=this.form[c]&&void 0!=this.form[c]?!0:!1},hide:function(){$("#lookup-modal").modal("hide")},inject:function(c,a){var d="lookup"==a.mode?angular.element(document.getElementById("lookup-modal-body")):a.id?angular.element(document.getElementById(a.id)):
["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+=f.columnClass?" "+f.columnClass:"";e+='" ';e+=f.ngClass?h(f,"ngClass"):"";e+=">\n";e+=f.ngShow?"<span "+h(f,"ngShow")+">":"";g.hasChildren&&f.hasChildren&&(e+='<span class="level-{{ '+g.iterator+'.event_level }}"><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+'" class="level-{{ '+g.iterator+'.event_level }}-detail" ></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";h+="</ul>\n";h+="</div>\n";h+='<select ng-show="'+m+'SelectShow" ng-model="'+m+'SearchSelectValue" ng-change="search(\''+m+"')\" ";h+='ng-options="c.name for c in '+m+'SearchSelectOpts" class="search-select';h+=g?" field-mini-height":"";h+='"></select>\n';h+='<input ng-hide="'+m+"SelectShow || "+m+'InputHide" class="input-medium';h+=g?" field-mini-height":"";h+='" ng-model="'+m+'SearchValue" ng-change="search(\''+m+'\')" placeholder="Search" type="text" >\n';
h+='<div class="btn-group">\n';h+='<button ng-hide="'+m+"SelectShow || "+m+"HideSearchType || "+m+'InputHide" class="btn ';h+=g?"btn-mini ":"btn-small";h+='dropdown-toggle" data-toggle="dropdown">\n';h+='<span ng-bind="'+m+'SearchTypeLabel"></span>\n';h+='<span class="caret"></span>\n';h+="</button>\n";h+='<ul class="dropdown-menu">\n';h+='<li><a href="" ng-click="setSearchType(\''+m+"','iexact','Exact Match')\">Exact Match</a></li>\n";h+='<li><a href="" ng-click="setSearchType(\''+m+"','icontains','Contains')\">Contains</a></li>\n";
h+="</ul>\n";h+="</div>\n";h+="</div>\n";h+='<div class="spin"><i class="icon-spinner icon-spin" ng-show="'+m+'SearchSpin == true"></i></div>\n';return h+="</div>\n"}}).factory("PaginateWidget",function(){return function(h){var m=h.set,k=h.iterator,g=h.mini;h=h.mode?h.mode:null;var c="",c=("lookup"==h?c+'<div class="lookup-navigation':c+'<div class="footer-navigation')+(g?" related-footer":""),c=c+'">\n',c=c+'<form class="form-inline">\n',c=c+'<button class="previous btn',c=c+(g?' btn-mini" ':'" '),
c=c+("ng-click=\"prevSet('"+m+"','"+k+'\')" ng-disabled="'+k+"PrevUrl == null || "+k+'PrevUrl == undefined"><i class="icon-chevron-left"></i> Prev</button>\n'),c=c+'<button class="next btn btn',c=c+(g?' btn-mini" ':'" '),c=c+(" ng-click=\"nextSet('"+m+"','"+k+'\')"ng-disabled="'+k+"NextUrl == null || "+k+'NextUrl == undefined">Next <i class="icon-chevron-right"></i></button>\n');"lookup"!=h&&(c+='<label class="page-size-label">Rows per page:</label>\n',c+='<select ng-model="'+k+'PageSize" ng-change="changePageSize(\''+
m+"','"+k+'\')" class="input-mini',c+=g?" field-mini-height":"",c+=' page-size">\n',c+='<option value="10" selected>10</option>\n',c+='<option value="20" selected>20</option>\n',c+='<option value="40">40</option>\n',c+='<option value="60">60</option>\n',c+='<option value="80">80</option>\n',c+="</select>\n");c+='<div class="page-number-small" ng-show="'+k+'PageCount > 0" ';c+=">Page: {{ "+k+"Page + 1 }} of {{ "+k+"PageCount }}</div>\n";c+="</form>\n";return c+="</div>\n"}});angular.module("ListGenerator",["GeneratorHelpers"]).factory("GenerateList",["$location","$compile","$rootScope","SearchWidget","PaginateWidget","Attr","Icon","Column",function(h,m,k,g,c,p,f,e){return{setList:function(c){this.list=c},attr:p,icon:f,has:function(c){return this.form[c]&&null!=this.form[c]&&void 0!=this.form[c]?!0:!1},hide:function(){$("#lookup-modal").modal("hide")},inject:function(c,a){var d="lookup"==a.mode?angular.element(document.getElementById("lookup-modal-body")):a.id?angular.element(document.getElementById(a.id)):
angular.element(document.getElementById("htmlTemplate"));this.setList(c);d.html(this.build(a));this.scope=d.scope();m(d)(this.scope);"lookup"==a.mode&&(this.scope.lookupHeader=a.hdr,$("#lookup-modal").modal());return this.scope},build:function(f){var a="",d=this.list;if("lookup"!=f.mode&&(void 0==f.breadCrumbs||!0==f.breadCrumbs))a+='<div class="nav-path">\n<ul class="breadcrumb">\n',a+='<li ng-repeat="crumb in breadcrumbs"><a href="{{ \'#\' + crumb.path }}">{{ crumb.title | capitalize }}</a> <span class="divider">/</span></li>\n',
a+='<li class="active">',a="select"==f.mode?a+d.selectTitle:a+d.editTitle,a+="</li>\n</ul>\n</div>\n";"select"==f.mode&&d.selectInstructions?(a+='<div class="alert alert-info alert-block">\n',a+='<button type="button" class="close" data-dismiss="alert">&times;</button>\n',a+="<strong>Hint: </strong>"+d.selectInstructions+"\n",a+="</div>\n"):"edit"==f.mode&&d.editInstructions&&(a+='<div class="alert alert-info alert-block">\n',a+='<button type="button" class="close" data-dismiss="alert">&times;</button>\n',
a+="<strong>Hint: </strong>"+d.editInstructions+"\n",a+="</div>\n");if("lookup"!=f.mode&&(void 0==d.well||"true"==d.well))a+='<div class="well">\n';a="lookup"==f.mode||void 0!=f.id?a+g({iterator:d.iterator,template:d,mini:!0}):a+g({iterator:d.iterator,template:d,mini:!1});if("lookup"!=f.mode){var b=h.path().replace(/^\//,"").split("/")[0],a=a+'<div class="list-actions">\n';for(action in d.actions)if("all"==d.actions[action].mode||d.actions[action].mode==f.mode)if(void 0==d.actions[action].basePaths||
d.actions[action].basePaths&&-1<d.actions[action].basePaths.indexOf(b))a+="<button "+this.attr(d.actions[action],"ngClick")+'class="btn',a+=d.actions[action]["class"]?" "+d.actions[action]["class"]:" btn-small",a+='" ',a+=d.actions[action].ngHide?this.attr(d.actions[action],"ngHide"):"",a+=d.actions[action].awToolTip?this.attr(d.actions[action],"awToolTip"):"",a+=d.actions[action].awToolTip&&void 0==d.actions[action].dataPlacement?'data-placement="top" ':"",a+=d.actions[action].awPopOver?this.attr(d.actions[action],
"awPopOver"):"",a+=d.actions[action].dataPlacement?this.attr(d.actions[action],"dataPlacement"):"",a+=d.actions[action].dataContainer?this.attr(d.actions[action],"dataContainer"):"",a+=d.actions[action].dataTitle?this.attr(d.actions[action],"dataTitle"):"",a+=" >"+this.icon(d.actions[action].icon),a+=d.actions[action].label?" "+d.actions[action].label:"",a+="</button> ";if("select"==f.mode&&(void 0==f.selectButton||!0==f.selectButton))a+=' <button class="btn btn-small btn-success" aw-tool-tip="Complete your selection" ng-click="finishSelection()"><i class="icon-ok"></i> Finished</button>\n';
a+="</div>\n"}a+='<table class="table table-condensed';a+=d["class"]?" "+d["class"]:"";a+="lookup"==f.mode||d.hover?" table-hover":"";a+='">\n';a+="<thead>\n";a+="<tr>\n";d.index&&(a+="<th>#</th>\n");for(var k in d.fields)if((void 0==d.fields[k].searchOnly||!1==d.fields[k].searchOnly)&&!("lookup"==f.mode&&void 0!==d.fields[k].excludeModal&&!0==d.fields[k].excludeModal)){a+='<th class="list-header" id="';a+=d.fields[k].id?d.fields[k].id:k+"-header";a+='"';a+=void 0===d.fields[k].nosort||!0!==d.fields[k].nosort?
"ng-click=\"sort('"+k+"')\"":"";a+=">"+d.fields[k].label;if(void 0===d.fields[k].nosort||!0!==d.fields[k].nosort)a+=' <i class="',a=d.fields[k].key?d.fields[k].desc?a+"icon-sort-down":a+"icon-sort-up":a+"icon-sort",a+='"></i></a>';a+="</th>\n"}"select"==f.mode?a+="<th>Select</th>":"edit"==f.mode&&(a+="<th></th>\n");a+="</tr>\n";a+="</thead>\n";a+="<tbody>\n";a+="<tr ";a+="lookup"==f.mode||"select"==f.mode?'ng-class="'+d.iterator+"_{{ "+d.iterator+'.id }}_class" ':"";a+='class="'+d.iterator+'_class" ng-repeat="'+
d.iterator+" in "+d.name;a+=d.orderBy?" | orderBy:'"+d.orderBy+"'":"";a+=d.filterBy?" | filter: "+d.filterBy:"";a+='"';a+="lookup"==f.mode||"select"==f.mode?' ng-click="toggle_'+d.iterator+"({{ "+d.iterator+'.id }})"':"";a+=">\n";d.index&&(a+='<td class="index-column">{{ $index + ('+d.iterator+"Page * "+d.iterator+"PageSize) + 1 }}.</td>\n");var m=2,b=d.base?d.base:d.name,b=b.replace(/^\//,"");for(k in d.fields)if(m++,(void 0==d.fields[k].searchOnly||!1==d.fields[k].searchOnly)&&!("lookup"==f.mode&&
void 0!==d.fields[k].excludeModal&&!0==d.fields[k].excludeModal))a+=e({list:d,fld:k,options:f,base:b});if("select"==f.mode)a+='<td><input type="checkbox" name="check_{{'+d.iterator+'.id}}" id="check_{{'+d.iterator+'.id}}" /></td>';else if("edit"==f.mode){a+='<td class="actions">';for(action in d.fieldActions)a+='<button class="btn',a+=d.fieldActions[action]["class"]?" "+d.fieldActions[action]["class"]:" btn-small",a+='" '+this.attr(d.fieldActions[action],"ngClick"),a+=d.fieldActions[action].ngShow?
this.attr(d.fieldActions[action],"ngShow"):"",a+=d.fieldActions[action].awToolTip?this.attr(d.fieldActions[action],"awToolTip"):"",a+=d.fieldActions[action].ngDisabled?this.attr(d.fieldActions[action],"ngDisabled"):"",a+=">",a+=d.fieldActions[action].icon?this.icon(d.fieldActions[action].icon):"",a+=d.fieldActions[action].label?" "+d.fieldActions[action].label:"",a+="</button> ";a+="</td>"}a+="</tr>\n";a+='<tr class="info" ng-show="'+d.iterator+"Loading == false && ("+d.name+" == null || "+d.name+
'.length == 0)">\n';a+='<td colspan="'+m+'"><div class="alert alert-info">No records matched your search.</div></td>\n';a+="</tr>\n";a+='<tr class="info" ng-show="'+d.iterator+'Loading == true">\n';a+='<td colspan="'+m+'"><div class="alert alert-info">Loading...</div></td>\n';a+="</tr>\n";a+="</tbody>\n";a+="</table>\n";if("lookup"!=f.mode&&(void 0==d.well||"true"==d.well))a+="</div>\n";return a="lookup"==f.mode||f.id&&"form-modal-body"==f.id?a+c({set:d.name,iterator:d.iterator,mini:!0,mode:"lookup"}):
a+c({set:d.name,iterator:d.iterator,mini:!0})}}}]);angular.module("PromptDialog",["Utilities"]).factory("Prompt",["Alert",function(h){return function(h){var k=angular.element(document.getElementById("prompt-modal")),g=k.scope();g.promptHeader=h.hdr;g.promptBody=h.body;var c=null==h["class"]||void 0==h["class"]?"btn-danger":h["class"];$("#prompt-action-btn").addClass(c);g.promptAction=h.action;$(k).modal({backdrop:"static",keyboard:!0,show:!0})}}]);angular.module("RestServices",["ngCookies","AuthService"]).factory("Rest",["$http","$rootScope","$cookieStore","Authorization",function(h,m,k,g){return{setUrl:function(c){this.url=c},auth:{Authorization:"Token "+g.getToken()},pReplace:function(){var c,g;for(c in this.params)g=RegExp("\\:"+c,"gm"),g.test(this.url)&&(this.url=this.url.replace(g,this.params[c]),delete this.params[c])},get:function(c){c=c?c:{};this.params=c.params?c.params:null;this.pReplace();return h({method:"GET",url:this.url,headers:this.auth,
a+="</div>\n"}a+='<table class="table table-condensed';a+=d["class"]?" "+d["class"]:"";a+="lookup"==f.mode||d.hover?" table-hover":"";a+='">\n';a+="<thead>\n";a+="<tr>\n";d.index&&(a+="<th>#</th>\n");for(var k in d.fields)if((void 0==d.fields[k].searchOnly||!1==d.fields[k].searchOnly)&&!("lookup"==f.mode&&void 0!==d.fields[k].excludeModal&&!0==d.fields[k].excludeModal)){a+='<th class="list-header';a+=d.fields[k].columnClass?" "+d.fields[k].columnClass:"";a+='" id="';a+=d.fields[k].id?d.fields[k].id:
k+"-header";a+='"';a+=void 0===d.fields[k].nosort||!0!==d.fields[k].nosort?"ng-click=\"sort('"+k+"')\"":"";a+=">"+d.fields[k].label;if(void 0===d.fields[k].nosort||!0!==d.fields[k].nosort)a+=' <i class="',a=d.fields[k].key?d.fields[k].desc?a+"icon-sort-down":a+"icon-sort-up":a+"icon-sort",a+='"></i></a>';a+="</th>\n"}"select"==f.mode?a+="<th>Select</th>":"edit"==f.mode&&(a+="<th></th>\n");a+="</tr>\n";a+="</thead>\n";a+="<tbody>\n";a+="<tr ";a+="lookup"==f.mode||"select"==f.mode?'ng-class="'+d.iterator+
"_{{ "+d.iterator+'.id }}_class" ':"";a+='class="'+d.iterator+'_class" ng-repeat="'+d.iterator+" in "+d.name;a+=d.orderBy?" | orderBy:'"+d.orderBy+"'":"";a+=d.filterBy?" | filter: "+d.filterBy:"";a+='"';a+="lookup"==f.mode||"select"==f.mode?' ng-click="toggle_'+d.iterator+"({{ "+d.iterator+'.id }})"':"";a+=">\n";d.index&&(a+='<td class="index-column">{{ $index + ('+d.iterator+"Page * "+d.iterator+"PageSize) + 1 }}.</td>\n");var m=2,b=d.base?d.base:d.name,b=b.replace(/^\//,"");for(k in d.fields)if(m++,
(void 0==d.fields[k].searchOnly||!1==d.fields[k].searchOnly)&&!("lookup"==f.mode&&void 0!==d.fields[k].excludeModal&&!0==d.fields[k].excludeModal))a+=e({list:d,fld:k,options:f,base:b});if("select"==f.mode)a+='<td><input type="checkbox" name="check_{{'+d.iterator+'.id}}" id="check_{{'+d.iterator+'.id}}" /></td>';else if("edit"==f.mode){a+='<td class="actions">';for(action in d.fieldActions)a+='<button class="btn',a+=d.fieldActions[action]["class"]?" "+d.fieldActions[action]["class"]:" btn-small",a+=
'" '+this.attr(d.fieldActions[action],"ngClick"),a+=d.fieldActions[action].ngShow?this.attr(d.fieldActions[action],"ngShow"):"",a+=d.fieldActions[action].awToolTip?this.attr(d.fieldActions[action],"awToolTip"):"",a+=d.fieldActions[action].ngDisabled?this.attr(d.fieldActions[action],"ngDisabled"):"",a+=">",a+=d.fieldActions[action].icon?this.icon(d.fieldActions[action].icon):"",a+=d.fieldActions[action].label?" "+d.fieldActions[action].label:"",a+="</button> ";a+="</td>"}a+="</tr>\n";a+='<tr class="info" ng-show="'+
d.iterator+"Loading == false && ("+d.name+" == null || "+d.name+'.length == 0)">\n';a+='<td colspan="'+m+'"><div class="alert alert-info">No records matched your search.</div></td>\n';a+="</tr>\n";a+='<tr class="info" ng-show="'+d.iterator+'Loading == true">\n';a+='<td colspan="'+m+'"><div class="alert alert-info">Loading...</div></td>\n';a+="</tr>\n";a+="</tbody>\n";a+="</table>\n";if("lookup"!=f.mode&&(void 0==d.well||"true"==d.well))a+="</div>\n";return a="lookup"==f.mode||f.id&&"form-modal-body"==
f.id?a+c({set:d.name,iterator:d.iterator,mini:!0,mode:"lookup"}):a+c({set:d.name,iterator:d.iterator,mini:!0})}}}]);angular.module("PromptDialog",["Utilities"]).factory("Prompt",["Alert",function(h){return function(h){var k=angular.element(document.getElementById("prompt-modal")),g=k.scope();g.promptHeader=h.hdr;g.promptBody=h.body;var c=null==h["class"]||void 0==h["class"]?"btn-danger":h["class"];$("#prompt-action-btn").addClass(c);g.promptAction=h.action;$(k).modal({backdrop:"static",keyboard:!0,show:!0})}}]);angular.module("RestServices",["ngCookies","AuthService"]).factory("Rest",["$http","$rootScope","$cookieStore","Authorization",function(h,m,k,g){return{setUrl:function(c){this.url=c},auth:{Authorization:"Token "+g.getToken()},pReplace:function(){var c,g;for(c in this.params)g=RegExp("\\:"+c,"gm"),g.test(this.url)&&(this.url=this.url.replace(g,this.params[c]),delete this.params[c])},get:function(c){c=c?c:{};this.params=c.params?c.params:null;this.pReplace();return h({method:"GET",url:this.url,headers:this.auth,
params:this.params})},post:function(c){return h({method:"POST",url:this.url,headers:this.auth,data:c})},put:function(c){return h({method:"PUT",url:this.url,headers:this.auth,data:c})},destroy:function(c){return h({method:"DELETE",url:this.url,headers:this.auth,data:c})}}}]);angular.module("Utilities",[]).factory("ClearScope",function(){return function(h){h=document.getElementById(h);angular.element(h).scope().$destroy()}}).factory("ToggleClass",function(){return function(h,m){$(h)&&$(h).hasClass(m)?$(h).removeClass(m):$(h)&&$(h).addClass(m)}}).factory("Alert",["$rootScope","$location",function(h,m){return function(k,g,c,m,f,e){if(f){if(h.alertHeader2=k,h.alertBody2=g,h.alertClass2=c?c:"alert-error",$("#alert-modal2").modal({show:!0,keyboard:!0,backdrop:"static"}),h.disableButtons2=
e?!0:!1,m)$("#alert-modal2").on("hidden",function(){m()})}else if(h.alertHeader=k,h.alertBody=g,h.alertClass=c?c:"alert-error",$("#alert-modal").modal({show:!0,keyboard:!0,backdrop:"static"}),h.disableButtons=e?!0:!1,m)$("#alert-modal").on("hidden",function(){m()})}}]).factory("ProcessErrors",["$log","Alert",function(h,m){return function(h,g,c,p,f){if(403==c)h="The API responded with a 403 Access Denied error. You do not have permission to perform the requested action. ",h=g.detail?h+("Detail: "+
g.detail):h+"Please contact your system administrator.",m("Access Denied",h);else if(g.non_field_errors)m("Error!",g.non_field_errors);else if(g.detail)m(f.hdr,f.msg+" "+g.detail);else if(g.__all__)m("Error!",g.__all__);else if(p){c=!1;for(var e in p.fields)p.fields[e].realName&&g[p.fields[e].realName]&&(h[e+"_api_error"]=g[p.fields[e]][0],c=!0),p.fields[e].sourceModel?g[e]&&(h[p.fields[e].sourceModel+"_"+p.fields[e].sourceField+"_api_error"]=g[e][0],c=!0):g[e]&&(h[e+"_api_error"]=g[e][0],c=!0);!c&&
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)}}]);
"-",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)+":");return m+=("0"+h.getSeconds()).slice(-2)}}]);

View File

@ -35,7 +35,7 @@ function JobEventsList ($scope, $rootScope, $location, $log, $routeParams, Rest,
function formatJSON(eventData) {
//turn JSON event data into an html form
var html = '';
if (eventData.res) {
if (eventData['res']) {
var found = false;
var n, rows;
if (typeof eventData.res == 'string') {
@ -77,14 +77,19 @@ function JobEventsList ($scope, $rootScope, $location, $log, $routeParams, Rest,
}
if (fld == "rc" && eventData.res[fld] != 0) {
html += "<label>Return Code:</label>\n";
html += "<input type=\"text\" value=\"" + eventData.res[fld] + "\" readonly >\n";
html += "<input type=\"text\" class=\"input-mini\" value=\"" + eventData.res[fld] + "\" readonly >\n";
found = true;
}
}
}
html = (found) ? "<form class=\"event-detail\">\n" + html + "</form>\n" : '';
html = (found) ? "<form class=\"event-form\">\n" + html + "</form>\n" : '';
}
if (eventData['host']) {
html = "<span class=\"event-detail-host visible-phone visible-tablet\">" + eventData['host'] + "</span>\n" + html;
}
else {
html = (html == '' ) ? null : html;
}
html = (html == '' ) ? null : html;
return html;
}

View File

@ -29,6 +29,7 @@ angular.module('JobEventsListDefinition', [])
status: {
label: 'Status',
icon: 'icon-circle',
showValue: true,
"class": 'job-\{\{ jobevent.status \}\}',
searchField: 'failed',
searchType: 'boolean',
@ -50,7 +51,9 @@ angular.module('JobEventsListDefinition', [])
ngBind: 'jobevent.summary_fields.host.name',
searchField: 'hosts__name',
nosort: true,
id: 'job-event-host-header'
searchOnly: false,
id: 'job-event-host-header',
columnClass: 'hidden-phone hidden-tablet'
}
},

View File

@ -87,6 +87,7 @@ angular.module('GeneratorHelpers', ['GeneratorHelpers'])
html += "<td ";
html += "<td class=\"" + fld + "-column";
html += (field['class']) ? " " + field['class'] : "";
html += (field['columnClass']) ? " " + field['columnClass'] : "";
html += "\" ";
html += (field.ngClass) ? Attr(field, 'ngClass') : "";
html += ">\n";
@ -96,7 +97,7 @@ angular.module('GeneratorHelpers', ['GeneratorHelpers'])
// Add collapse/expand icon --used on job_events page
if (list['hasChildren'] && field.hasChildren) {
html += "<span style=\"padding-left: \{\{ " + list.iterator + ".spaces \}\}px\"><a href=\"\" ng-click=\"\{\{ " + list.iterator + ".ngclick \}\}\"> " +
html += "<span class=\"level-\{\{ " + list.iterator + ".event_level \}\}\"><a href=\"\" ng-click=\"\{\{ " + list.iterator + ".ngclick \}\}\"> " +
"<i class=\"\{\{ " + list.iterator + ".ngicon \}\}\" ng-show=\"'\{\{ " +
list.iterator + ".related.children \}\}' !== ''\" ></i></a> ";
}
@ -155,7 +156,7 @@ angular.module('GeneratorHelpers', ['GeneratorHelpers'])
// Specific to Job Events page -showing event detail/results
html += (field.appendHTML) ? "<div ng-show=\"" + field.appendHTML + " !== null\" " +
"ng-bind-html-unsafe=\"" + field.appendHTML + "\" " +
"style=\"padding-left: \{\{ " + list.iterator + ".spaces + 12 \}\}px\" " +
"class=\"level-\{\{ " + list.iterator + ".event_level \}\}-detail\" " +
"></div>\n" : "";
return html += "</td>\n";

View File

@ -159,7 +159,9 @@ angular.module('ListGenerator', ['GeneratorHelpers'])
for (var fld in list.fields) {
if ( (list.fields[fld].searchOnly == undefined || list.fields[fld].searchOnly == false) &&
!(options.mode == 'lookup' && list.fields[fld].excludeModal !== undefined && list.fields[fld].excludeModal == true) ) {
html += "<th class=\"list-header\" id=\"";
html += "<th class=\"list-header";
html += (list.fields[fld].columnClass) ? " " + list.fields[fld].columnClass : "";
html += "\" id=\"";
html += (list.fields[fld].id) ? list.fields[fld].id : fld + "-header";
html += "\"";
html += (list.fields[fld].nosort === undefined || list.fields[fld].nosort !== true) ? "ng-click=\"sort('" + fld + "')\"" : "";

View File

@ -188,8 +188,8 @@ angular.module('Utilities',[])
result += ('0' + dt.getDate()).slice(-2) + ' ';
result += ('0' + dt.getHours()).slice(-2) + ':';
result += ('0' + dt.getMinutes()).slice(-2) + ':';
result += ('0' + dt.getSeconds()).slice(-2) + ':';
result += ('000' + dt.getMilliseconds()).slice(-3);
result += ('0' + dt.getSeconds()).slice(-2);
//result += ('000' + dt.getMilliseconds()).slice(-3);
return result;
}
}]);