From 7fcb4e0e0b9804dbf8c95d8bec7bb77c9bf0bb78 Mon Sep 17 00:00:00 2001 From: chouseknecht Date: Wed, 10 Jul 2013 13:45:44 -0400 Subject: [PATCH] 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. --- awx/ui/static/css/ansible-ui.css | 118 ++++++++++++++---- awx/ui/static/js/awx-min.js | 47 +++---- awx/ui/static/js/controllers/JobEvents.js | 13 +- awx/ui/static/js/lists/JobEvents.js | 5 +- .../static/lib/ansible/generator-helpers.js | 5 +- awx/ui/static/lib/ansible/list-generator.js | 4 +- awx/ui/static/lib/ansible/utilities.js | 4 +- 7 files changed, 137 insertions(+), 59 deletions(-) diff --git a/awx/ui/static/css/ansible-ui.css b/awx/ui/static/css/ansible-ui.css index 4471ba3a6d..e7d56dd676 100644 --- a/awx/ui/static/css/ansible-ui.css +++ b/awx/ui/static/css/ansible-ui.css @@ -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; + } +} \ No newline at end of file diff --git a/awx/ui/static/js/awx-min.js b/awx/ui/static/js/awx-min.js index 3fe35589f5..a50e112b9c 100644 --- a/awx/ui/static/js/awx-min.js +++ b/awx/ui/static/js/awx-min.js @@ -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[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+="\n",f+='\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+="\n";n=(n=c.res[k].match(/\n/g))?n.length:1;f+='\n";l=!0}if("results"==k&&Array.isArray(c.res[k])&&0Results:\n";l="";for(n=0;n'+l+"\n";l=!0}"rc"== -k&&0!=c.res[k]&&(f+="\n",f+='\n',l=!0)}}f=l?'
\n'+f+"
\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+="\n",f+='\n',l=!0)}}f=l?'
\n'+f+"
\n":""}f=c.host?''+c.host+"\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 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 }}.\n" 'data-placement="top" ':"",html+=">"+this.icon(k.icon),html+=k.label?" "+k.label:"",html+=" ";html+="";html+="\n";html+='\n';html+='
No records matched your search.
\n';html+="\n";html+='\n';html+='
Loading...
\n'; html+="\n";html+="\n";html+="\n";html+="\n";html+="\n";html+=c({set:b,iterator:d.related[b].iterator,mini:!0});html+="\n";a++}html+="\n";return html+="\n"}}}]);angular.module("GeneratorHelpers",["GeneratorHelpers"]).factory("Attr",function(){return function(h,m){var k;k="string"===typeof h[m]?h[m].replace(/\'/g,"""):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' '}}).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="\n";e+=f.ngShow?"":"";g.hasChildren&&f.hasChildren&&(e+=' "); -if((f.key||f.link||f.linkTo||f.ngClick)&&"lookup"!=p.mode&&"select"!=p.mode)if(f.linkTo)e+='';else if(f.ngClick)e+='';else if(void 0==f.link||f.link)e+='';f.ngShowIcon?e+=' ':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+="");if((f.key||f.link||f.linkTo||f.ngClick)&&"lookup"!=p.mode&&"select"!=p.mode)e+="";e+=f.ngShow?"":"";e+=f.appendHTML?'
\n':"";return e+"\n"}}]).factory("SearchWidget",function(){return function(h){var m=h.iterator,k=h.template,g=h.mini;h=h.label?h.label:null;h='
\n'+(h?"":"");h+='
\n'; -h+='
\n';h+='\n";h+='\n";h+="
\n";h+=' 0" ';c+=">Page: {{ "+k+"Page + 1 }} of {{ "+k+"PageCount }}
\n";c+="\n";return c+="
\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="\n";e+=f.ngShow?"":"";g.hasChildren&&f.hasChildren&&(e+=' ");if((f.key||f.link||f.linkTo||f.ngClick)&&"lookup"!=p.mode&&"select"!=p.mode)if(f.linkTo)e+='';else if(f.ngClick)e+='';else if(void 0==f.link||f.link)e+='';f.ngShowIcon?e+=' ':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+="");if((f.key||f.link||f.linkTo||f.ngClick)&&"lookup"!=p.mode&&"select"!=p.mode)e+="";e+=f.ngShow?"":"";e+=f.appendHTML?'
\n':"";return e+"\n"}}]).factory("SearchWidget",function(){return function(h){var m=h.iterator,k=h.template,g=h.mini;h=h.label?h.label:null;h='
\n'+ +(h?"":"");h+='
\n';h+='
\n';h+='\n";h+='\n";h+="
\n";h+=' 0" ';c+=">Page: {{ "+k+"Page + 1 }} of {{ "+k+"PageCount }}
\n";c+="\n";return c+="
\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+='\n";"select"==f.mode&&d.selectInstructions?(a+='
\n',a+='\n',a+="Hint: "+d.selectInstructions+"\n",a+="
\n"):"edit"==f.mode&&d.editInstructions&&(a+='
\n',a+='\n', a+="Hint: "+d.editInstructions+"\n",a+="
\n");if("lookup"!=f.mode&&(void 0==d.well||"true"==d.well))a+='
\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+'
\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"+this.icon(d.actions[action].icon),a+=d.actions[action].label?" "+d.actions[action].label:"",a+=" ";if("select"==f.mode&&(void 0==f.selectButton||!0==f.selectButton))a+=' \n'; -a+="
\n"}a+='"+d.fields[k].label;if(void 0===d.fields[k].nosort||!0!==d.fields[k].nosort)a+=' Select":"edit"==f.mode&&(a+="\n");a+="\n";a+="\n";a+="\n";a+="\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+='';else if("edit"==f.mode){a+='"}a+="\n";a+='\n';a+='\n';a+="\n";a+='\n';a+='\n';a+="\n";a+="\n";a+="
';for(action in d.fieldActions)a+=' ";a+="
No records matched your search.
Loading...
\n";if("lookup"!=f.mode&&(void 0==d.well||"true"==d.well))a+="
\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+="\n"}a+='"+d.fields[k].label;if(void 0===d.fields[k].nosort||!0!==d.fields[k].nosort)a+=' Select":"edit"==f.mode&&(a+="\n");a+="\n";a+="\n";a+="\n";a+="\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+='';else if("edit"==f.mode){a+='"}a+="\n";a+='\n';a+='\n';a+="\n";a+='\n';a+='\n';a+="\n";a+="\n";a+="
';for(action in d.fieldActions)a+=' ";a+="
No records matched your search.
Loading...
\n";if("lookup"!=f.mode&&(void 0==d.well||"true"==d.well))a+="\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\n"; + html += "\n"; found = true; } } } - html = (found) ? "
\n" + html + "
\n" : ''; + html = (found) ? "
\n" + html + "
\n" : ''; + } + if (eventData['host']) { + html = "" + eventData['host'] + "\n" + html; + } + else { + html = (html == '' ) ? null : html; } - html = (html == '' ) ? null : html; return html; } diff --git a/awx/ui/static/js/lists/JobEvents.js b/awx/ui/static/js/lists/JobEvents.js index f0c6677ed1..0f64ddc90a 100644 --- a/awx/ui/static/js/lists/JobEvents.js +++ b/awx/ui/static/js/lists/JobEvents.js @@ -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' } }, diff --git a/awx/ui/static/lib/ansible/generator-helpers.js b/awx/ui/static/lib/ansible/generator-helpers.js index 4b57a9ad1c..1da9e786d4 100644 --- a/awx/ui/static/lib/ansible/generator-helpers.js +++ b/awx/ui/static/lib/ansible/generator-helpers.js @@ -87,6 +87,7 @@ angular.module('GeneratorHelpers', ['GeneratorHelpers']) html += " " + + html += " " + " "; } @@ -155,7 +156,7 @@ angular.module('GeneratorHelpers', ['GeneratorHelpers']) // Specific to Job Events page -showing event detail/results html += (field.appendHTML) ? "
\n" : ""; return html += "\n"; diff --git a/awx/ui/static/lib/ansible/list-generator.js b/awx/ui/static/lib/ansible/list-generator.js index 90e12319d7..30849adcbe 100644 --- a/awx/ui/static/lib/ansible/list-generator.js +++ b/awx/ui/static/lib/ansible/list-generator.js @@ -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 += "