pmux-logview 0.3.4 → 0.3.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,4 +7,4 @@
7
7
  * Author: Felix Gnass [fgnass at neteye dot de]
8
8
  * Version: 1.0.0
9
9
  */
10
- (function($){$.fn.activity=function(opts){this.each(function(){var $this=$(this);var el=$this.data("activity");if(el){clearInterval(el.data("interval"));el.remove();$this.removeData("activity");}if(opts!==false){opts=$.extend({color:$this.css("color")},$.fn.activity.defaults,opts);el=render($this,opts).css("position","absolute").prependTo(opts.outside?"body":$this);var h=$this.outerHeight()-el.height();var w=$this.outerWidth()-el.width();var margin={top:opts.valign=="top"?opts.padding:opts.valign=="bottom"?h-opts.padding:Math.floor(h/2),left:opts.align=="left"?opts.padding:opts.align=="right"?w-opts.padding:Math.floor(w/2)};var offset=$this.offset();if(opts.outside){el.css({top:offset.top+"px",left:offset.left+"px"});}else{margin.top-=el.offset().top-offset.top;margin.left-=el.offset().left-offset.left;}el.css({marginTop:margin.top+"px",marginLeft:margin.left+"px"});animate(el,opts.segments,Math.round(10/opts.speed)/10);$this.data("activity",el);}});return this;};$.fn.activity.defaults={segments:12,space:3,length:7,width:4,speed:1.2,align:"center",valign:"center",padding:4};$.fn.activity.getOpacity=function(opts,i){var steps=opts.steps||opts.segments-1;var end=opts.opacity!==undefined?opts.opacity:1/steps;return 1-Math.min(i,steps)*(1-end)/steps;};var render=function(){return $("<div>").addClass("busy");};var animate=function(){};function svg(tag,attr){var el=document.createElementNS("http://www.w3.org/2000/svg",tag||"svg");if(attr){$.each(attr,function(k,v){el.setAttributeNS(null,k,v);});}return $(el);}if(document.createElementNS&&document.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect){render=function(target,d){var innerRadius=d.width*2+d.space;var r=(innerRadius+d.length+Math.ceil(d.width/2)+1);var el=svg().width(r*2).height(r*2);var g=svg("g",{"stroke-width":d.width,"stroke-linecap":"round",stroke:d.color}).appendTo(svg("g",{transform:"translate("+r+","+r+")"}).appendTo(el));for(var i=0;i<d.segments;i++){g.append(svg("line",{x1:0,y1:innerRadius,x2:0,y2:innerRadius+d.length,transform:"rotate("+(360/d.segments*i)+", 0, 0)",opacity:$.fn.activity.getOpacity(d,i)}));}return $("<div>").append(el).width(2*r).height(2*r);};if(document.createElement("div").style.WebkitAnimationName!==undefined){var animations={};animate=function(el,steps,duration){if(!animations[steps]){var name="spin"+steps;var rule="@-webkit-keyframes "+name+" {";for(var i=0;i<steps;i++){var p1=Math.round(100000/steps*i)/1000;var p2=Math.round(100000/steps*(i+1)-1)/1000;var value="% { -webkit-transform:rotate("+Math.round(360/steps*i)+"deg); }\n";rule+=p1+value+p2+value;}rule+="100% { -webkit-transform:rotate(100deg); }\n}";document.styleSheets[0].insertRule(rule);animations[steps]=name;}el.css("-webkit-animation",animations[steps]+" "+duration+"s linear infinite");};}else{animate=function(el,steps,duration){var rotation=0;var g=el.find("g g").get(0);el.data("interval",setInterval(function(){g.setAttributeNS(null,"transform","rotate("+(++rotation%steps*(360/steps))+")");},duration*1000/steps));};}}else{var s=$("<shape>").css("behavior","url(#default#VML)").appendTo("body");if(s.get(0).adj){var sheet=document.createStyleSheet();$.each(["group","shape","stroke"],function(){sheet.addRule(this,"behavior:url(#default#VML);");});render=function(target,d){var innerRadius=d.width*2+d.space;var r=(innerRadius+d.length+Math.ceil(d.width/2)+1);var s=r*2;var o=-Math.ceil(s/2);var el=$("<group>",{coordsize:s+" "+s,coordorigin:o+" "+o}).css({top:o,left:o,width:s,height:s});for(var i=0;i<d.segments;i++){el.append($("<shape>",{path:"m "+innerRadius+",0 l "+(innerRadius+d.length)+",0"}).css({width:s,height:s,rotation:(360/d.segments*i)+"deg"}).append($("<stroke>",{color:d.color,weight:d.width+"px",endcap:"round",opacity:$.fn.activity.getOpacity(d,i)})));}return $("<group>",{coordsize:s+" "+s}).css({width:s,height:s,overflow:"hidden"}).append(el);};animate=function(el,steps,duration){var rotation=0;var g=el.get(0);el.data("interval",setInterval(function(){g.style.rotation=++rotation%steps*(360/steps);},duration*1000/steps));};}$(s).remove();}})(jQuery);
10
+ (function($){$.fn.activity=function(opts){this.each(function(){var $this=$(this);var el=$this.data("activity");if(el){clearInterval(el.data("interval"));el.remove();$this.removeData("activity");}if(opts!==false){opts=$.extend({color:$this.css("color")},$.fn.activity.defaults,opts);el=render($this,opts).css("position","absolute").prependTo(opts.outside?"body":$this);var h=$this.outerHeight()-el.height();var w=$this.outerWidth()-el.width();var margin={top:opts.valign=="top"?opts.padding:opts.valign=="bottom"?h-opts.padding:Math.floor(h/2),left:opts.align=="left"?opts.padding:opts.align=="right"?w-opts.padding:Math.floor(w/2)};var offset=$this.offset();if(opts.outside){el.css({top:offset.top+"px",left:offset.left+"px"});}else{margin.top-=el.offset().top-offset.top;margin.left-=el.offset().left-offset.left;}el.css({marginTop:margin.top+"px",marginLeft:margin.left+"px"});animate(el,opts.segments,Math.round(10/opts.speed)/10);$this.data("activity",el);}});return this;};$.fn.activity.defaults={segments:12,space:3,length:7,width:4,speed:1.2,align:"center",valign:"center",padding:4};$.fn.activity.getOpacity=function(opts,i){var steps=opts.steps||opts.segments-1;var end=opts.opacity!==undefined?opts.opacity:1/steps;return 1-Math.min(i,steps)*(1-end)/steps;};var render=function(){return $("<div>").addClass("busy");};var animate=function(){};function svg(tag,attr){var el=document.createElementNS("http://www.w3.org/2000/svg",tag||"svg");if(attr){$.each(attr,function(k,v){el.setAttributeNS(null,k,v);});}return $(el);}if(document.createElementNS&&document.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect){render=function(target,d){var innerRadius=d.width*2+d.space;var r=(innerRadius+d.length+Math.ceil(d.width/2)+1);var el=svg().width(r*2).height(r*2);var g=svg("g",{"stroke-width":d.width,"stroke-linecap":"round",stroke:d.color}).appendTo(svg("g",{transform:"translate("+r+","+r+")"}).appendTo(el));for(var i=0;i<d.segments;i++){g.append(svg("line",{x1:0,y1:innerRadius,x2:0,y2:innerRadius+d.length,transform:"rotate("+(360/d.segments*i)+", 0, 0)",opacity:$.fn.activity.getOpacity(d,i)}));}return $("<div>").append(el).width(2*r).height(2*r);};if(document.createElement("div").style.WebkitAnimationName!==undefined){var animations={};animate=function(el,steps,duration){if(!animations[steps]){var name="spin"+steps;var rule="@-webkit-keyframes "+name+" {";for(var i=0;i<steps;i++){var p1=Math.round(100000/steps*i)/1000;var p2=Math.round(100000/steps*(i+1)-1)/1000;var value="% { -webkit-transform:rotate("+Math.round(360/steps*i)+"deg); }\n";rule+=p1+value+p2+value;}rule+="100% { -webkit-transform:rotate(100deg); }\n}";document.styleSheets[0].insertRule(rule,0);animations[steps]=name;}el.css("-webkit-animation",animations[steps]+" "+duration+"s linear infinite");};}else{animate=function(el,steps,duration){var rotation=0;var g=el.find("g g").get(0);el.data("interval",setInterval(function(){g.setAttributeNS(null,"transform","rotate("+(++rotation%steps*(360/steps))+")");},duration*1000/steps));};}}else{var s=$("<shape>").css("behavior","url(#default#VML)").appendTo("body");if(s.get(0).adj){var sheet=document.createStyleSheet();$.each(["group","shape","stroke"],function(){sheet.addRule(this,"behavior:url(#default#VML);");});render=function(target,d){var innerRadius=d.width*2+d.space;var r=(innerRadius+d.length+Math.ceil(d.width/2)+1);var s=r*2;var o=-Math.ceil(s/2);var el=$("<group>",{coordsize:s+" "+s,coordorigin:o+" "+o}).css({top:o,left:o,width:s,height:s});for(var i=0;i<d.segments;i++){el.append($("<shape>",{path:"m "+innerRadius+",0 l "+(innerRadius+d.length)+",0"}).css({width:s,height:s,rotation:(360/d.segments*i)+"deg"}).append($("<stroke>",{color:d.color,weight:d.width+"px",endcap:"round",opacity:$.fn.activity.getOpacity(d,i)})));}return $("<group>",{coordsize:s+" "+s}).css({width:s,height:s,overflow:"hidden"}).append(el);};animate=function(el,steps,duration){var rotation=0;var g=el.get(0);el.data("interval",setInterval(function(){g.style.rotation=++rotation%steps*(360/steps);},duration*1000/steps));};}$(s).remove();}})(jQuery);
@@ -5,9 +5,8 @@ pmux_logview.index = {
5
5
  job_log_sort_order: "desc",
6
6
  job_log_nitems: 20,
7
7
  job_log_page: 0,
8
- job_log_jobs: {},
9
- job_log_jobs_cookie: 0,
10
- reload_job_log_type: "archive",
8
+ job_log_realtime_jobs: {},
9
+ job_log_search_jobs: {},
11
10
  reload_job_log_initialized: false,
12
11
  reload_dispatcher_log_initialized: false,
13
12
  job_log_ajax_requested: false,
@@ -20,11 +19,16 @@ pmux_logview.index = {
20
19
  tab_active_index: 0,
21
20
  selected_job_id: null,
22
21
  $main_tab: null,
23
- $job_log_table: null,
22
+ $job_log_realtime_table: null,
23
+ $job_log_search_table: null,
24
+ $job_log_type: null,
24
25
  $dispatcher_log_table: null,
26
+ $load_button: null,
25
27
  $more_button: null,
26
28
  $job_chart_tchart: null,
27
- max_mapper_length: 35
29
+ max_mapper_length: 35,
30
+ $start_date_picker: null,
31
+ $end_date_picker: null
28
32
  };
29
33
 
30
34
  pmux_logview.index.draw_job_chart = function() {
@@ -44,22 +48,42 @@ pmux_logview.index.draw_job_chart = function() {
44
48
  tasks : {}
45
49
  };
46
50
  var job_count = 0;
47
- for (job_id in this.job_log_jobs) {
48
- var from = Number(this.job_log_jobs[job_id].start_time_msec);
49
- var to;
50
- if ("end_time_msec" in this.job_log_jobs[job_id]) {
51
- to = Number(this.job_log_jobs[job_id].end_time_msec);
52
- } else {
53
- continue;
51
+ if (this.$job_log_type.val() == "realtime") {
52
+ for (job_id in this.job_log_realtime_jobs) {
53
+ var from = Number(this.job_log_realtime_jobs[job_id].start_time_msec);
54
+ var to;
55
+ if ("end_time_msec" in this.job_log_realtime_jobs[job_id]) {
56
+ to = Number(this.job_log_realtime_jobs[job_id].end_time_msec);
57
+ } else {
58
+ continue;
59
+ }
60
+ source.tasks[job_id] = {
61
+ name: "id " + job_id,
62
+ from: from,
63
+ to: to,
64
+ clickEventArg: this.job_log_realtime_jobs[job_id],
65
+ nextTasks: null
66
+ }
67
+ job_count += 1;
54
68
  }
55
- source.tasks[job_id] = {
56
- name: "id " + job_id,
57
- from: from,
58
- to: to,
59
- clickEventArg: this.job_log_jobs[job_id],
60
- nextTasks: null
69
+ } else {
70
+ for (job_id in this.job_log_search_jobs) {
71
+ var from = Number(this.job_log_search_jobs[job_id].start_time_msec);
72
+ var to;
73
+ if ("end_time_msec" in this.job_log_search_jobs[job_id]) {
74
+ to = Number(this.job_log_search_jobs[job_id].end_time_msec);
75
+ } else {
76
+ continue;
77
+ }
78
+ source.tasks[job_id] = {
79
+ name: "id " + job_id,
80
+ from: from,
81
+ to: to,
82
+ clickEventArg: this.job_log_search_jobs[job_id],
83
+ nextTasks: null
84
+ }
85
+ job_count += 1;
61
86
  }
62
- job_count += 1;
63
87
  }
64
88
  if (job_count != 0) {
65
89
  this.$job_chart_tchart.tchart('update', source);
@@ -78,47 +102,141 @@ pmux_logview.index.update_progress_bar = function() {
78
102
  });
79
103
  };
80
104
 
81
- pmux_logview.index.reload_job_log = function(force) {
105
+ pmux_logview.index.reload_job_log = function(force, change_ui) {
82
106
  if (!this.parent.can_reload) {
83
107
  return;
84
108
  }
85
109
  if (!force && this.job_log_ajax_requested) {
86
110
  return;
87
111
  }
112
+ this.job_log_ajax_requested = true;
88
113
  var self = this;
89
- var param = { sort_key: this.job_log_sort_key,
90
- sort_order: this.job_log_sort_order,
91
- type: this.reload_job_log_type,
114
+ var param = { sort_order: this.job_log_sort_order,
92
115
  nitems: this.job_log_nitems,
93
- page: this.job_log_page,
94
- jobs_cookie: this.job_log_jobs_cookie };
116
+ page: this.job_log_page }
95
117
  this.parent.ajax_base("log/job", "GET", param).done(function(data, textStatus, XMLHttpRequest) {
96
- if (!("jobs_cookie" in data && "jobs" in data)) {
97
- self.$job_log_table.fnClearTable();
98
- self.$job_log_table.fnAddData(["invalid response", "", "", "", ""]);
99
- self.parent.activityOff(function(){ self.$main_tab.tabs("option", "disabled", false) });
118
+ if (!("jobs" in data)) {
119
+ self.$job_log_realtime_table.fnClearTable();
120
+ self.$job_log_realtime_table.fnAddData(["invalid response", "", "", "", ""]);
121
+ self.job_log_ajax_requested = false;
122
+ if (change_ui) {
123
+ self.parent.activityOff(function(){ self.$main_tab.tabs("option", "disabled", false) });
124
+ self.$more_button.show();
125
+ }
100
126
  return;
101
127
  }
102
- $.extend(true, self.job_log_jobs, data.jobs);
103
- self.job_log_jobs_cookie = data.jobs_cookie;
104
- self.$job_log_table.fnClearTable();
128
+ $.extend(true, self.job_log_realtime_jobs, data.jobs);
129
+ self.$job_log_realtime_table.fnClearTable();
105
130
  var sorted_jobs = [];
106
- for (var job_id in self.job_log_jobs) {
107
- if (self.$job_log_table.fnSettings().aaSorting.length == 0) {
108
- var inserted = false;
109
- for (var i = 0; i < sorted_jobs.length; i++) {
110
- if (Number(self.job_log_jobs[job_id]["start_time_msec"]) > Number(sorted_jobs[i]["start_time_msec"])) {
111
- sorted_jobs.splice(i, 0, self.job_log_jobs[job_id]);
112
- inserted = true;
113
- break;
114
- }
115
- }
116
- if (!inserted) {
117
- sorted_jobs.push(self.job_log_jobs[job_id]);
118
- }
131
+ for (var job_id in self.job_log_realtime_jobs) {
132
+ sorted_jobs.push(self.job_log_realtime_jobs[job_id]);
133
+ }
134
+ if (self.$job_log_realtime_table.fnSettings().aaSorting.length == 0) {
135
+ sorted_jobs.sort(function(a,b){
136
+ var aTime = Number(a.start_time_msec);
137
+ var bTime = Number(b.start_time_msec);
138
+ if ( aTime < bTime ) return 1;
139
+ if ( aTime > bTime ) return -1;
140
+ return 0;
141
+ });
142
+ }
143
+ var body_array = [];
144
+ for (i = 0; i < sorted_jobs.length; i++) {
145
+ var row_array = []
146
+ var job_id_html = '';
147
+ job_id_html += '<button class="detail-button container button-color button-normalize ui-corner-all" data-job-id="' + sorted_jobs[i]["job_id"] + '">';
148
+ if ("error_status" in sorted_jobs[i]) {
149
+ job_id_html += ' <span class="icon-space"><font color="red">' + sorted_jobs[i].job_id + '</font></span>';
119
150
  } else {
120
- sorted_jobs.push(self.job_log_jobs[job_id]);
151
+ job_id_html += ' <span class="icon-space">' + sorted_jobs[i].job_id + '</span>';
121
152
  }
153
+ job_id_html += ' </span><span class="button-icon-adjust ui-icon ui-icon-info"></span>';
154
+ job_id_html += '</button>';
155
+ if ("error_status" in sorted_jobs[i]) {
156
+ job_id_html += '<button class="error-button error-info button-color button-normalize ui-corner-all" data-error-status="' + sorted_jobs[i].error_status + '" data-error-message="' + self.parent.html_escape(sorted_jobs[i].error_message) + '">';
157
+ job_id_html += '<div class="error-info ui-state-error"><span class="error-info ui-icon ui-icon-alert"></span></div>';
158
+ job_id_html += '</button>';
159
+ }
160
+ row_array.push(job_id_html)
161
+ if (sorted_jobs[i].mapper && sorted_jobs[i].mapper.length > self.max_mapper_length) {
162
+ row_array.push('<span class="text-ellipsis">'+ self.parent.html_escape(sorted_jobs[i].mapper.substring(0, self.max_mapper_length)) + '...</span>');
163
+ } else {
164
+ row_array.push('<span class="text-ellipsis">'+ self.parent.html_escape(sorted_jobs[i].mapper) + '</span>');
165
+ }
166
+ row_array.push('<span class="cell-nowrap">' + sorted_jobs[i].start_time + '</span>');
167
+ if (sorted_jobs[i].end_time.match(/^\d+%$/)) {
168
+ var percent = sorted_jobs[i].end_time.replace("%","");
169
+ row_array.push('<span class="cell-nowrap"><div class="progress-bar" data-value="' + percent + '" ></div></span>');
170
+ } else {
171
+ row_array.push('<span class="cell-nowrap">' + sorted_jobs[i].end_time + '</span>');
172
+ }
173
+ row_array.push(sorted_jobs[i].elapsed_time);
174
+ body_array.push(row_array);
175
+ }
176
+ self.$job_log_realtime_table.fnAddData(body_array);
177
+ self.update_progress_bar();
178
+ self.valid_last_job_id = true;
179
+ self.job_log_ajax_requested = false;
180
+ if (change_ui) {
181
+ self.parent.activityOff(function(){ self.$main_tab.tabs("option", "disabled", false) });
182
+ self.$more_button.show();
183
+ }
184
+ }).fail(function(XMLHttpRequest, textStatus, errorThrown) {
185
+ self.parent.open_dialog("job log の読み込みに失敗しました。");
186
+ self.job_log_ajax_requested = false;
187
+ if (change_ui) {
188
+ self.parent.activityOff(function(){ self.$main_tab.tabs("option", "disabled", false) });
189
+ self.$more_button.show();
190
+ }
191
+ });
192
+ };
193
+
194
+ pmux_logview.index.load_job_log = function(force, change_ui) {
195
+ if (!this.parent.can_reload) {
196
+ return;
197
+ }
198
+ if (!force && this.job_log_ajax_requested) {
199
+ return;
200
+ }
201
+ this.job_log_ajax_requested = true;
202
+ var self = this;
203
+ var param = { sort_order: this.job_log_sort_order,
204
+ nitems: this.job_log_nitems,
205
+ page: this.job_log_page }
206
+ var start_date = this.$start_date_picker.datepicker('getDate');
207
+ var end_date = this.$end_date_picker.datepicker('getDate');
208
+ if (start_date != null) {
209
+ param.start_time_msec = start_date.getTime();
210
+ }
211
+ if (end_date != null) {
212
+ param.end_time_msec = end_date.getTime();
213
+ }
214
+ this.parent.ajax_base("log/job", "GET", param).done(function(data, textStatus, XMLHttpRequest) {
215
+ if (!("jobs" in data)) {
216
+ self.$job_log_search_table.fnClearTable();
217
+ self.$job_log_search_table.fnAddData(["invalid response", "", "", "", ""]);
218
+ self.job_log_ajax_requested = false;
219
+ if (change_ui) {
220
+ self.parent.activityOff(function(){ self.$main_tab.tabs("option", "disabled", false) });
221
+ self.$load_button.show();
222
+ }
223
+ return;
224
+ }
225
+ self.job_log_search_jobs = {};
226
+ $.extend(true, self.job_log_search_jobs, data.jobs);
227
+ self.$job_log_search_table.fnClearTable();
228
+ var sorted_jobs = [];
229
+ for (var job_id in self.job_log_search_jobs) {
230
+ sorted_jobs.push(self.job_log_search_jobs[job_id]);
231
+ }
232
+ if (self.$job_log_search_table.fnSettings().aaSorting.length == 0) {
233
+ sorted_jobs.sort(function(a,b){
234
+ var aTime = Number(a.start_time_msec);
235
+ var bTime = Number(b.start_time_msec);
236
+ if ( aTime < bTime ) return 1;
237
+ if ( aTime > bTime ) return -1;
238
+ return 0;
239
+ });
122
240
  }
123
241
  var body_array = [];
124
242
  for (i = 0; i < sorted_jobs.length; i++) {
@@ -153,18 +271,22 @@ pmux_logview.index.reload_job_log = function(force) {
153
271
  row_array.push(sorted_jobs[i].elapsed_time);
154
272
  body_array.push(row_array);
155
273
  }
156
- self.$job_log_table.fnAddData(body_array);
274
+ self.$job_log_search_table.fnAddData(body_array);
157
275
  self.update_progress_bar();
158
- self.parent.activityOff(function(){ self.$main_tab.tabs("option", "disabled", false) });
159
276
  self.valid_last_job_id = true;
160
- self.reload_job_log_type = "update";
161
277
  self.job_log_ajax_requested = false;
278
+ if (change_ui) {
279
+ self.parent.activityOff(function(){ self.$main_tab.tabs("option", "disabled", false) });
280
+ self.$load_button.show();
281
+ }
162
282
  }).fail(function(XMLHttpRequest, textStatus, errorThrown) {
163
283
  self.parent.open_dialog("job log の読み込みに失敗しました。");
164
- self.parent.activityOff(function(){ self.$main_tab.tabs("option", "disabled", false) });
165
284
  self.job_log_ajax_requested = false;
285
+ if (change_ui) {
286
+ self.parent.activityOff(function(){ self.$main_tab.tabs("option", "disabled", false) });
287
+ self.$load_button.show();
288
+ }
166
289
  });
167
- self.job_log_ajax_requested = true;
168
290
  };
169
291
 
170
292
  pmux_logview.index.reload_dispatcher_log = function() {
@@ -197,13 +319,12 @@ pmux_logview.index.reload = function() {
197
319
  if (this.need_reload_job_log) {
198
320
  if (this.reload_job_log_timer_id == null) {
199
321
  this.reload_job_log_timer_id = setInterval(function(){
200
- self.reload_job_log(false);
322
+ self.reload_job_log(false, false);
201
323
  }, 3000);
202
324
  }
203
325
  if (!this.reload_job_log_initialized) {
204
326
  this.parent.activityOn(function(){ self.$main_tab.tabs("option", "disabled", true) });
205
- this.reload_job_log_type = "archive";
206
- this.reload_job_log(true);
327
+ this.reload_job_log(true, true);
207
328
  this.reload_job_log_initialized = true;
208
329
  }
209
330
  } else {
@@ -251,16 +372,62 @@ pmux_logview.index.initialize = function() {
251
372
  if (self.tab_active_index == 0) {
252
373
  self.need_reload_job_log = true;
253
374
  self.need_reload_dispatcher_log = false;
254
- } else if (self.tab_active_index == 1) {
375
+ }else if (self.tab_active_index == 1) {
255
376
  self.need_reload_job_log = false;
256
- self.need_reload_dispatcher_log = true;
377
+ self.need_reload_dispatcher_log = false;
257
378
  } else if (self.tab_active_index == 2) {
379
+ self.need_reload_job_log = false;
380
+ self.need_reload_dispatcher_log = true;
381
+ } else if (self.tab_active_index == 3) {
382
+ self.need_reload_job_log = false;
383
+ self.need_reload_dispatcher_log = false;
258
384
  self.draw_job_chart();
259
385
  }
260
386
  self.reload();
261
387
  }
262
388
  });
263
- this.$job_log_table = $("#job-log-table").dataTable({
389
+ this.$job_log_realtime_table = $("#job-log-realtime-table").dataTable({
390
+ aaSorting: [],
391
+ bPaginate: false,
392
+ bScrollCollapse: true,
393
+ bSort: true,
394
+ bFilter: true,
395
+ bJQueryUI: true,
396
+ bAutoWidth: true,
397
+ sPaginationType: "full_numbers",
398
+ fnRowCallback: function(nRow) {
399
+ if (nRow.cells[0]) nRow.cells[0].noWrap = true;
400
+ if (nRow.cells[1]) nRow.cells[1].noWrap = true;
401
+ return nRow
402
+ },
403
+ fnDrawCallback: function() {
404
+ self.update_progress_bar();
405
+ var $this = (this)
406
+ if ($this.fnSettings().aaSorting.length != 0) {
407
+ var sort_key = self.job_log_sort_keys[$this.fnSettings().aaSorting[0][0]];
408
+ var sort_order = $this.fnSettings().aaSorting[0][1];
409
+ if (self.job_log_sort_key != sort_key || self.job_log_sort_order != sort_order) {
410
+ self.job_log_sort_key = sort_key;
411
+ self.job_log_sort_order = sort_order;
412
+ }
413
+ }
414
+ self.$error_button = $(".error-button").click(function(event) {
415
+ var html = '<table class="border task-tooltip"><thead class="task-tooltip"></thead>';
416
+ html += '<tbody class="task-tooltip"><tr class="task-tooltip">';
417
+ html += '<td class="task-tooltip">status:</td>';
418
+ html += '<td class="task-tooltip">' + $(event.currentTarget).attr("data-error-status") +'</td>';
419
+ html += '</tr><tr class="task-tooltip">';
420
+ html += '<td class="task-tooltip">message:</td>';
421
+ html += '<td class="task-tooltip">' + $(event.currentTarget).attr("data-error-message") +'</td>';
422
+ html += '</tr></tbody></table>';
423
+ self.parent.open_tooltip(html, event.target, event);
424
+ });
425
+ self.$detail_button = $(".detail-button").click(function(event) {
426
+ self.open_detail($(event.currentTarget).attr("data-job-id"));
427
+ });
428
+ }
429
+ });
430
+ this.$job_log_search_table = $("#job-log-search-table").dataTable({
264
431
  aaSorting: [],
265
432
  bPaginate: false,
266
433
  bScrollCollapse: true,
@@ -283,9 +450,6 @@ pmux_logview.index.initialize = function() {
283
450
  if (self.job_log_sort_key != sort_key || self.job_log_sort_order != sort_order) {
284
451
  self.job_log_sort_key = sort_key;
285
452
  self.job_log_sort_order = sort_order;
286
- self.job_log_page = 0;
287
- self.reload_job_log_type = "archive";
288
- self.reload_job_log(true);
289
453
  }
290
454
  }
291
455
  self.$error_button = $(".error-button").click(function(event) {
@@ -315,9 +479,9 @@ pmux_logview.index.initialize = function() {
315
479
  });
316
480
  this.$more_button = $("#more-button").click(function() {
317
481
  self.job_log_page += 1;
318
- self.reload_job_log_type = "archive";
482
+ self.$more_button.hide();
319
483
  self.parent.activityOn(function(){ self.$main_tab.tabs("option", "disabled", true) });
320
- self.reload_job_log(true);
484
+ self.reload_job_log(true, true);
321
485
  });
322
486
  this.$job_chart_tchart = $("#job-chart-tchart").tchart({
323
487
  onTaskClick: function(task, target, event) {
@@ -338,11 +502,25 @@ pmux_logview.index.initialize = function() {
338
502
  self.parent.open_tooltip(html, target, event);
339
503
  }
340
504
  });
505
+ this.$start_date_picker = $("#start-date-picker").datetimepicker({ dateFormat: "yy-mm-dd",
506
+ timeFormat: 'HH:mm:ss',
507
+ showMonthAfterYear: true });
508
+ this.$end_date_picker = $("#end-date-picker").datetimepicker({ dateFormat: 'yy-mm-dd',
509
+ timeFormat: 'HH:mm:ss',
510
+ showMonthAfterYear: true});
341
511
  $(window).resize(function() {
342
512
  if (self.draw_invoke_timer_id == null) {
343
513
  self.draw_invoke_timer_id = setInterval(function() { self.draw_invoke() }, 1000);
344
514
  }
345
515
  });
516
+ this.$load_button = $("#load-button").click(function() {
517
+ self.$load_button.hide();
518
+ self.parent.activityOn(function(){ self.$main_tab.tabs("option", "disabled", true) });
519
+ self.load_job_log(true, true);
520
+ });
521
+ this.$job_log_type = $("#job-log-type").change(function() {
522
+ self.draw_job_chart();
523
+ });
346
524
  this.reload();
347
525
  };
348
526
 
@@ -151,8 +151,8 @@
151
151
  commonData.tasks = [];
152
152
  commonData.containers = [ {cls: "scrollButtonsContainer"},
153
153
  {cls: "optionsContainer" } ];
154
- commonData.datePickerContainersData = [ {cls: "datePickerContainer startDatePickerContainer", label: "start :"},
155
- {cls: "datePickerContainer endDatePickerContainer", label: "end :"} ]
154
+ commonData.datePickerContainersData = [ {cls: "datePickerContainer startDatePickerContainer", label: "start date :"},
155
+ {cls: "datePickerContainer endDatePickerContainer", label: "end date :"} ]
156
156
  commonData.datePickersData = [ {span: "span.startDatePickerContainer", data: [{ cls: "startDatePicker" }] },
157
157
  {span: "span.endDatePickerContainer", data: [{ cls: "endDatePicker" }] } ]
158
158
  if (source.actors != null) {
@@ -1,5 +1,5 @@
1
1
  module Pmux
2
2
  module LogView
3
- VERSION = "0.3.4"
3
+ VERSION = "0.3.10"
4
4
  end
5
5
  end
@@ -9,11 +9,13 @@
9
9
  <script type="text/javascript" src="js/jquery.dataTables.min.js"></script>
10
10
  <script type="text/javascript" src="js/d3.v3.min.js"></script>
11
11
  <script type="text/javascript" src="js/jquery.activity-indicator-1.0.0.min.js"></script>
12
+ <script type="text/javascript" src="js/jquery-ui-timepicker-addon.js"></script>
12
13
  <script type="text/javascript" src="js/tchart.js"></script>
13
14
  <script type="text/javascript" src="js/pmux-logview-base.js"></script>
14
15
  <script type="text/javascript" src="js/pmux-logview-index.js"></script>
15
16
  <link rel="stylesheet" type="text/css" href="css/jquery-ui-1.10.0.css" />
16
17
  <link rel="stylesheet" type="text/css" href="css/jquery.dataTables.css" />
18
+ <link rel="stylesheet" type="text/css" href="css/jquery-ui-timepicker-addon.css" />
17
19
  <link rel="stylesheet" type="text/css" href="css/tchart.css" />
18
20
  <link rel="stylesheet" type="text/css" href="css/pmux-logview.css" />
19
21
  </head>
@@ -42,12 +44,13 @@
42
44
  <div class="tabs-container">
43
45
  <div id="main-tabs">
44
46
  <ul>
45
- <li><a href="#job-log">job log</a></li>
47
+ <li><a href="#job-log-realtime">job log (realtime)</a></li>
48
+ <li><a href="#job-log-search">job log (search)</a></li>
46
49
  <li><a href="#dispatcher-log">dispatcher log</a></li>
47
50
  <li><a href="#job-chart">job chart</a></li>
48
51
  </ul>
49
- <div id="job-log">
50
- <table id="job-log-table" class="border">
52
+ <div id="job-log-realtime">
53
+ <table id="job-log-realtime-table" class="border">
51
54
  <thead>
52
55
  <tr>
53
56
  <th>id</th>
@@ -57,7 +60,7 @@
57
60
  <th>elapsed time</th>
58
61
  </tr>
59
62
  </thead>
60
- <tbody id="job-log-table-body">
63
+ <tbody id="job-log-realtime-table-body">
61
64
  </tbody>
62
65
  </table>
63
66
  <div>
@@ -66,6 +69,37 @@
66
69
  </button>
67
70
  </div>
68
71
  </div>
72
+ <div id="job-log-search">
73
+ <div id="date-picker">
74
+ <table class="y-space">
75
+ <thead>
76
+ </thead>
77
+ <tbody>
78
+ <tr>
79
+ <td class="x-space">end timeの日時で絞り込み</td>
80
+ <td class="x-space">検索開始日:</td>
81
+ <td class="x-space"><input type="text" id="start-date-picker"></input></td>
82
+ <td class="x-space">検索終了日:</td>
83
+ <td class="x-space"><input type="text" id="end-date-picker"></input></td>
84
+ <td class="x-space"><button id="load-button" class="button-color button-normalize ui-corner-all">ロード</button></td>
85
+ </tr>
86
+ </tbody>
87
+ </table>
88
+ </div>
89
+ <table id="job-log-search-table" class="border">
90
+ <thead>
91
+ <tr>
92
+ <th>id</th>
93
+ <th>mapper</th>
94
+ <th>start time</th>
95
+ <th>end time</th>
96
+ <th>elapsed time</th>
97
+ </tr>
98
+ </thead>
99
+ <tbody id="job-log-search-table-body">
100
+ </tbody>
101
+ </table>
102
+ </div>
69
103
  <div id="dispatcher-log">
70
104
  <table id="dispatcher-log-table" class="border">
71
105
  <thead>
@@ -78,6 +112,12 @@
78
112
  </table>
79
113
  </div>
80
114
  <div id="job-chart">
115
+ <div class="y-space">
116
+ <select id="job-log-type">
117
+ <option value="realtime" selected>realtime</option>
118
+ <option value="search">search</option>
119
+ </select>
120
+ </div>
81
121
  <div class="job-chart-container background-gradient">
82
122
  <div id="job-chart-tchart">
83
123
  </div>