PluginProbe
Code Profiler – WordPress Performance Profiling and Debugging Made Easy / 1.9.6
Code Profiler – WordPress Performance Profiling and Debugging Made Easy v1.9.6
1.9.6 1.9.5 1.9.4 1.9.3 trunk 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.5 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.6 1.6.1 1.6.10 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 All 41 releases
← All changes | static/code-profiler.js +324 -68 1.4.21.9.6 View file →
@@ -5,9 +5,9 @@
5 5 | | | / _ \ / _` |/ _ \ | |_) | '__/ _ \| |_| | |/ _ \ '__| |
6 6 | | |__| (_) | (_| | __/ | __/| | | (_) | _| | | __/ | |
7 7 | \____\___/ \__,_|\___| |_| |_| \___/|_| |_|_|\___|_| |
8 8 | |
9 - | (c) Jerome Bruandet ~ https://code-profiler.com/ |
9 + | (c) Jerome Bruandet ~ https://nintechnet.com/codeprofiler/ |
10 10 +=====================================================================+
11 11 */
12 12
13 13 // =====================================================================
@@ -15,9 +15,9 @@
15 15
16 16 // TipTip tooltip
17 17 jQuery( document ).ready(function( $ ) {
18 18 'use strict';
19 - $( '.code-profiler-tip' ).tipTip( {
19 + $('.code-profiler-tip').tipTip( {
20 20 'attribute': 'data-tip',
21 21 'fadeIn': 50,
22 22 'fadeOut': 50,
23 23 'delay': 100,
@@ -28,9 +28,9 @@
28 28 // if the user reloaded the page that would throw an error:
29 29 var url = window.location.href;
30 30 window.history.replaceState({},
31 31 document.title,
32 - url.replace( /&action=delete_profiles&.+/, '' )
32 + url.replace( /&action=delete_profiles&.+/, '')
33 33 );
34 34
35 35 });
36 36
@@ -44,21 +44,21 @@
44 44 // Case sensitivity
45 45 if ( jQuery('#case-search-input').is(':checked') === true ) {
46 46 query += '&c=1';
47 47 }
48 - jQuery("#profile-form").attr('action', jQuery("#profile-form").attr('action')+ query );
48 + jQuery('#profile-form').attr('action', jQuery('#profile-form').attr('action')+ query );
49 49
50 50 } else {
51 - jQuery("#profile-form").attr('action','' );
51 + jQuery('#profile-form').attr('action','');
52 52 var url = window.location.href;
53 53 window.history.replaceState({},
54 54 document.title,
55 - url.replace( /&s=[^&$]+/, '' )
55 + url.replace( /&s=[^&$]+/, '')
56 56 );
57 57 var url = window.location.href;
58 58 window.history.replaceState({},
59 59 document.title,
60 - url.replace( /&c=1/, '' )
60 + url.replace( /&c=1/, '')
61 61 );
62 62 }
63 63 }
64 64
@@ -68,44 +68,106 @@
68 68 function cpjs_front_or_backend( item ) {
69 69 'use strict';
70 70 // Enable/disable frontend/backend select box
71 71 // depending on user's choice
72 - if ( item == 1 ) {
72 + if ( item == 'frontend') {
73 73 jQuery('#p-frontend').show();
74 74 jQuery('#p-backend').hide();
75 75 jQuery('#p-custom').hide();
76 + jQuery('#p-wpcron').hide();
76 77 jQuery('#id-frontend').focus();
77 78 jQuery('#user-unauthenticated').prop('disabled', false);
78 - } else if ( item == 2 ) {
79 + jQuery('#user-authenticated').prop('disabled', false);
80 + } else if ( item == 'backend') {
79 81 jQuery('#p-backend').show();
80 82 jQuery('#p-frontend').hide();
81 83 jQuery('#p-custom').hide();
84 + jQuery('#p-wpcron').hide();
82 85 jQuery('#id-backend').focus();
83 86 jQuery('#user-unauthenticated').prop('disabled', true);
84 - jQuery('#user-authenticated').prop('checked', true)
85 - } else {
87 + jQuery('#user-authenticated').prop('disabled', false);
88 + jQuery('#user-authenticated').prop('checked', true);
89 + jQuery('#user-name').prop('disabled', false);
90 + } else if ( item == 'custom') {
86 91 jQuery('#p-custom').show();
87 92 jQuery('#p-frontend').hide();
88 93 jQuery('#p-backend').hide();
94 + jQuery('#p-wpcron').hide();
89 95 jQuery('#id-custom').focus();
90 96 jQuery('#user-unauthenticated').prop('disabled', false);
97 + jQuery('#user-authenticated').prop('disabled', false);
98 + } else {
99 + jQuery('#p-wpcron').show();
100 + jQuery('#p-custom').hide();
101 + jQuery('#p-frontend').hide();
102 + jQuery('#p-backend').hide();
103 + jQuery('#id-wpcron').focus();
104 + jQuery('#user-unauthenticated').prop('disabled', false);
91 105 }
92 106 }
93 107
108 +function cpjs_authenticated( id ) {
109 + if ( id == 1 ) {
110 + jQuery('#user-name').prop('disabled', false);
111 + jQuery('#user-name').focus();
112 + } else {
113 + jQuery('#user-name').prop('disabled', true);
114 + }
115 +}
116 +
94 117 function cpjs_show_adv_settings() {
95 - jQuery("#cp-advanced-settings").slideDown();
96 - jQuery("#button-adv-settings").prop('disabled', true);
118 + jQuery('#cp-advanced-settings').slideDown();
119 + jQuery('#button-adv-settings').prop('disabled', true);
97 120 }
98 121
99 122 function cpjs_get_post( id ) {
100 123 if ( id == 1 ) {
101 - jQuery("#post-value").prop('disabled', false);
102 - jQuery("#post-value").focus();
124 + jQuery('#post-value').prop('disabled', false);
125 + jQuery('#id-content-type').prop('disabled', false);
126 + jQuery('#post-value').focus();
103 127 } else {
104 - jQuery("#post-value").prop('disabled', true);
128 + jQuery('#post-value').prop('disabled', true);
129 + jQuery('#id-content-type').prop('disabled', true);
105 130 }
106 131 }
107 132
133 +function cpjs_content_type( value ) {
134 + if ( value == 1 ) {
135 + jQuery('#ct-1').slideDown();
136 + jQuery('#ct-3').slideUp();
137 + jQuery('#ct-2').slideUp();
138 + } else if ( value == 2 ) {
139 + jQuery('#ct-2').slideDown();
140 + jQuery('#ct-3').slideUp();
141 + jQuery('#ct-1').slideUp();
142 + } else {
143 + jQuery('#ct-3').slideDown();
144 + jQuery('#ct-1').slideUp();
145 + jQuery('#ct-2').slideUp();
146 + }
147 +}
148 +
149 +function cpjs_isJSON( data ) {
150 +
151 + if ( jQuery('#id-content-type').val() == 1 || jQuery('#get-method').prop('checked') == true ) {
152 + // Ignore
153 + return 1;
154 + }
155 + try {
156 + return JSON.parse( data );
157 + } catch (e) {
158 + // Not a JSON-encoded string
159 + return null;
160 + }
161 +}
162 +
163 +function cpjs_ismultiline( data ) {
164 + if ( data.match( /[\n\r]/) ) {
165 + return true;
166 + }
167 + return false;
168 +}
169 +
108 170 // =====================================================================
109 171 // Log page: filter and delete the log.
110 172
111 173 function cpjs_filter_log() {
@@ -114,8 +176,9 @@
114 176 var bitmask = 0;
115 177 if ( document.cplogform.info.checked == true ) { bitmask += 1; }
116 178 if ( document.cplogform.warn.checked == true ) { bitmask += 2; }
117 179 if ( document.cplogform.error.checked == true ) { bitmask += 4; }
180 + if ( document.cplogform.debug.checked == true ) { bitmask += 8; }
118 181
119 182 // Clear the textarea
120 183 document.cplogform.cptxtlog.value = '';
121 184
@@ -123,9 +186,9 @@
123 186 var cp_count = 0;
124 187 var i = 0;
125 188 for ( i = 0; i < cplog_array.length; ++i ) {
126 189 var line = decodeURIComponent( cplog_array[i] );
127 - var line_array = line.split( '~~', 2 );
190 + var line_array = line.split('~~', 2 );
128 191 if ( line_array[0] & bitmask ) {
129 192 document.cplogform.cptxtlog.value += line_array[1];
130 193 ++cp_count;
131 194 }
@@ -145,12 +208,18 @@
145 208 // =====================================================================
146 209 // AJAX call to start the profiler.
147 210
148 211 function cpjs_start_profiler() {
212 +
149 213 'use strict';
214 +
215 + jQuery('html, body').animate( {
216 + scrollTop: jQuery('#button-adv-settings').offset().top
217 + }, 1000 );
218 +
150 219 // Get the nonce
151 220 var cp_nonce = jQuery('#cp_nonce').val();
152 - if ( cp_nonce == '' ) {
221 + if ( cp_nonce == '') {
153 222 alert( cpi18n.missing_nonce );
154 223 return;
155 224 }
156 225
@@ -155,23 +224,30 @@
155 224 }
156 225
157 226 // Get the scan type (frontend/backend)
158 227 var post;
159 - var where = jQuery('input[name="where"]:checked').val();
160 - if ( where == 'frontend' ) {
228 + var x_end = jQuery('input[name="x_end"]:checked').val();
229 + if ( x_end == 'frontend') {
161 230 post = jQuery('#id-frontend').val();
162 231
163 - } else if ( where == 'backend' ) {
232 + } else if ( x_end == 'backend') {
164 233 post = jQuery('#id-backend').val();
165 234
166 - } else if ( where == 'custom' ) {
235 + } else if ( x_end == 'custom') {
167 236 post = jQuery('#id-custom').val().trim(); // Trim user input
168 237
238 + } else if ( x_end == 'wpcron') {
239 + post = jQuery('#id-wpcron').val();
240 + if ( post == 0 ) {
241 + alert( cpi18n.missing_wpcron );
242 + return;
243 + }
244 +
169 245 } else {
170 246 alert( cpi18n.missing_frontbackend );
171 247 return;
172 248 }
173 - if ( post == '' ) {
249 + if ( post == '') {
174 250 alert( cpi18n.missing_post );
175 251 return;
176 252 }
177 253
@@ -176,29 +252,40 @@
176 252 }
177 253
178 254 // Get the profile's name
179 255 var profile = jQuery('input[name="profile"]').val();
180 - if ( profile == '' ) {
256 + if ( profile == '') {
181 257 alert( cpi18n.missing_profilename );
182 258 jQuery('input[name="profile"]').focus();
183 259 return;
184 260 }
185 261
186 - var user = jQuery('input[name="user"]:checked').val();
187 - if ( user == '' ) {
262 + var x_auth = jQuery('input[name="x_auth"]:checked').val();
263 + if ( x_auth == '') {
188 264 alert( cpi18n.missing_userauth );
189 265 return;
190 266 }
191 267
192 - var ua = jQuery('#ua-id').val();
193 - if ( ua == 'undefined' ) {
194 - ua = 'FireFox';
268 + var username = jQuery('#user-name').val().trim(); // Trim user input
269 + if ( x_auth == 'authenticated') {
270 + if ( username == '') {
271 + alert( cpi18n.missing_username );
272 + jQuery('#user-name').focus();
273 + return;
274 + }
195 275 }
196 276
277 + var user_agent = jQuery('#ua-id').val();
278 + if ( user_agent == 'undefined') {
279 + user_agent = 'FireFox';
280 + }
281 +
282 + var theme = jQuery('#id-theme').val();
283 +
197 284 // GET or POST
198 285 var method = jQuery('input[name="method"]:checked').val();
199 286 var payload = '';
200 - if ( method == 'post' ) {
287 + if ( method == 'post') {
201 288 // Payload
202 289 payload = jQuery('#post-value').val();
203 290 } else {
204 291 method = 'get';
@@ -203,10 +290,30 @@
203 290 } else {
204 291 method = 'get';
205 292 }
206 293
207 - var cookies = jQuery('#cp-cookies').val();
294 + //Content type
295 + var ct = jQuery('#id-content-type').val();
296 + if ( ct == 2 ) {
297 + // application/json
298 + if ( cpjs_isJSON( payload ) == null ) {
299 + alert( cpi18n.missing_ajax );
300 + jQuery('#user-name').focus();
301 + return;
302 + }
303 + } else if ( ct == 3 ) {
304 + // Raw format must be on one single line
305 + if ( cpjs_ismultiline( payload.trim() ) == true ) {
306 + alert( cpi18n.multiline_raw );
307 + jQuery('#post-value').focus();
308 + return;
309 + }
310 + }
208 311
312 + var cookies = jQuery('#cp-cookies').val();
313 + var headers = jQuery('#custom-headers').val();
314 + var exclusions = jQuery('#exclusions').val();
315 +
209 316 // Change buttons status and add animated image with status message
210 317 jQuery('#start-profile').prop('disabled', true);
211 318 jQuery('#cp-progress-div').slideDown();
212 319 jQuery('#progress-gif').slideDown();
@@ -216,20 +323,25 @@
216 323
217 324 var data = {
218 325 'action': 'codeprofiler_start_profiler',
219 326 'cp_nonce': cp_nonce,
220 - 'where': where,
327 + 'x_end': x_end,
221 328 'post': post,
329 + 'content_type': ct,
222 330 'profile': profile,
223 - 'user': user,
331 + 'x_auth': x_auth,
332 + 'username': username,
224 333 'cookies': cookies,
334 + 'custom_headers': headers,
335 + 'exclusions': exclusions,
225 336 'method': method,
226 337 'payload': payload,
227 - 'ua': ua
338 + 'user_agent': user_agent,
339 + 'theme': theme
228 340 };
229 341 // Send the request via AJAX
230 342 jQuery.ajax( {
231 - type: "POST",
343 + type: 'POST',
232 344 url: ajaxurl,
233 345 data: data,
234 346 dataType: 'json',
235 347 success: function( response ) {
@@ -234,14 +346,14 @@
234 346 dataType: 'json',
235 347 success: function( response ) {
236 348
237 349 if (typeof response === 'undefined') {
238 - cpjs_start_error( '<p>'+ cpi18n.unknown_error +'</p>' );
350 + cpjs_start_error('<p>'+ cpi18n.unknown_error +'</p>');
239 351 return;
240 352 }
241 353
242 - if ( response.status != 'success' ) {
243 - cpjs_start_error( '<p>'+ response.message +'</p>' );
354 + if ( response.status != 'success') {
355 + cpjs_start_error('<p>'+ response.message +'</p>');
244 356 return;
245 357 }
246 358
247 359 // ------------------------------------------------------------
@@ -251,9 +363,9 @@
251 363
252 364 data['action'] = 'codeprofiler_prepare_report';
253 365 data['microtime'] = response.microtime;
254 366 jQuery.ajax( {
255 - type: "POST",
367 + type: 'POST',
256 368 url: ajaxurl,
257 369 data: data,
258 370 dataType: 'json',
259 371 success: function( response ) {
@@ -258,18 +370,18 @@
258 370 dataType: 'json',
259 371 success: function( response ) {
260 372
261 373 if (typeof response === 'undefined') {
262 - cpjs_start_error( '<p>'+ cpi18n.unknown_error +'</p>' );
374 + cpjs_start_error('<p>'+ cpi18n.unknown_error +'</p>');
263 375 return;
264 376 }
265 377
266 - if ( response.status != 'success' ) {
267 - cpjs_start_error( '<p>'+ response.message +'</p>' );
378 + if ( response.status != 'success') {
379 + cpjs_start_error('<p>'+ response.message +'</p>');
268 380 return;
269 381 }
270 382 var cp_uri;
271 - if (response.cp_profile !== 'undefined' && response.cp_profile != '' ) {
383 + if (response.cp_profile !== 'undefined' && response.cp_profile != '') {
272 384 cp_uri = '&cptab=profiles_list&action=view_profile&id=' + response.cp_profile + '&section=1';
273 385 } else {
274 386 cp_uri = '&cptab=profiles_list';
275 387 }
@@ -282,16 +394,30 @@
282 394 },
283 395
284 396 // Display non-200 HTTP response
285 397 error: function( xhr, status, err ) {
286 - if ( err != '' ) {
287 -
398 + if ( err != '') {
288 399 if ( xhr.status != 0 ) {
289 - cpjs_start_error( '<p>'+ cpi18n.http_error +' '+ xhr.status +' '+ err +'.</p>' );
400 + var message = cpi18n.http_error +' '+ xhr.status +' '+ err;
401 + // Timeout
402 + if ( xhr.status == 503 || xhr.status == 504 ) {
403 + cpjs_start_error('<p>'+ message +'<br />'+ cpi18n.timeout_error +'.</p>');
404 + // Redirections, not found
405 + } else if ( xhr.status == 301 || xhr.status == 302 || xhr.status == 404 ) {
406 + cpjs_start_error('<p>'+ message +'<br />'+ cpi18n.notfound_error +'.</p>');
407 + // Forbidden
408 + } else if ( xhr.status == 403 ) {
409 + cpjs_start_error('<p>'+ message +'<br />'+ cpi18n.forbidden_error +'.</p>');
410 + // Internal error
411 + } else if ( xhr.status == 500 ) {
412 + cpjs_start_error('<p>'+ message +'<br />'+ cpi18n.internal_error +'.<br />'+ cpi18n.timeout_error +'.</p>');
413 + } else {
414 + cpjs_start_error('<p>'+ cpi18n.http_error +' '+ xhr.status +' '+ err +'.</p>');
415 + }
290 416 return;
291 417
292 418 } else {
293 - cpjs_start_error( '<p>'+ cpi18n.unknown_error +' '+ err +'.</p>' );
419 + cpjs_start_error('<p>'+ cpi18n.unknown_error +' '+ err +'.</p>');
294 420 return;
295 421 }
296 422 }
297 423 return;
@@ -301,16 +427,30 @@
301 427 },
302 428
303 429 // Display non-200 HTTP response
304 430 error: function( xhr, status, err ) {
305 - if ( err != '' ) {
306 -
431 + if ( err != '') {
307 432 if ( xhr.status != 0 ) {
308 - cpjs_start_error( '<p>'+ cpi18n.http_error +' '+ xhr.status +' '+ err +'.</p>' );
433 + var message = cpi18n.http_error +' '+ xhr.status +' '+ err;
434 + // Timeout
435 + if ( xhr.status == 503 || xhr.status == 504 ) {
436 + cpjs_start_error('<p>'+ message +'<br />'+ cpi18n.timeout_error +'.</p>');
437 + // Redirections, not found
438 + } else if ( xhr.status == 301 || xhr.status == 302 || xhr.status == 404 ) {
439 + cpjs_start_error('<p>'+ message +'<br />'+ cpi18n.notfound_error +'.</p>');
440 + // Forbidden
441 + } else if ( xhr.status == 403 ) {
442 + cpjs_start_error('<p>'+ message +'<br />'+ cpi18n.forbidden_error +'.</p>');
443 + // Internal error
444 + } else if ( xhr.status == 500 ) {
445 + cpjs_start_error('<p>'+ message +'<br />'+ cpi18n.internal_error +'.<br />'+ cpi18n.timeout_error +'.</p>');
446 + } else {
447 + cpjs_start_error('<p>'+ cpi18n.http_error +' '+ xhr.status +' '+ err +'.</p>');
448 + }
309 449 return;
310 450
311 451 } else {
312 - cpjs_start_error( '<p>'+ cpi18n.unknown_error +' '+ err +'.</p>' );
452 + cpjs_start_error('<p>'+ cpi18n.unknown_error +' '+ err +'.</p>');
313 453 return;
314 454 }
315 455 }
316 456 return;
@@ -341,8 +481,106 @@
341 481 }
342 482 return false;
343 483 }
344 484
485 +// Hide/show the edit box and buttons when renaming a profile.
486 +function cpjs_toggle_name( row ) {
487 + if ( jQuery('#profile_div_'+ row).css('display') == 'none') {
488 + jQuery('#profile_name_'+ row).hide();
489 + jQuery('#profile_div_'+ row).show();
490 + jQuery('#edit-'+ row).val( jQuery('#profile_name_'+ row).html() );
491 + jQuery('#edit-'+ row).focus();
492 + } else {
493 + jQuery('#profile_div_'+ row).hide();
494 + jQuery('#profile_name_'+ row).show();
495 + }
496 +}
497 +
498 +// Edit the profile name via AJAX endpoint.
499 +function cpjs_edit_name( profile, id, cp_nonce, row ) {
500 +
501 + 'use strict';
502 +
503 + if ( cp_nonce == '') {
504 + alert( cpi18n.missing_nonce );
505 + return;
506 + }
507 + if ( profile == '') {
508 + alert( cpi18n.missing_profileid );
509 + return;
510 + }
511 +
512 + var new_name = jQuery('#edit-'+ id).val().trim();
513 + if ( new_name == '') {
514 + alert( cpi18n.missing_profilename );
515 + return;
516 + }
517 +
518 + jQuery('#profile_spinner_'+ row).addClass('is-active');
519 +
520 + var data = {
521 + 'action': 'codeprofiler_rename',
522 + 'cp_nonce': cp_nonce,
523 + 'new_name': new_name,
524 + 'profile': profile,
525 + };
526 +
527 + // Send the request via AJAX
528 + jQuery.ajax( {
529 + type: 'POST',
530 + url: ajaxurl,
531 + data: data,
532 + dataType: 'json',
533 + success: function( response ) {
534 + jQuery('#profile_spinner_'+ row ).removeClass('is-active');
535 +
536 + if (typeof response === 'undefined') {
537 + alert( cpi18n.unknown_error );
538 + return;
539 + }
540 +
541 + if ( response.status != 'success') {
542 + alert( response.message );
543 + return;
544 + }
545 +
546 + // Success: update the name in the table
547 + jQuery('#profile_name_'+ id).html( response.newname );
548 + cpjs_toggle_name(row);
549 + },
550 + // Display non-200 HTTP response
551 + error: function( xhr, status, err ) {
552 + jQuery('#profile_spinner_'+ row ).removeClass('is-active');
553 + if ( err != '') {
554 + if ( xhr.status != 0 ) {
555 + var message = cpi18n.http_error +' '+ xhr.status +' '+ err;
556 + // Timeout
557 + if ( xhr.status == 503 || xhr.status == 504 ) {
558 + alert( message +'<br />'+ cpi18n.timeout_error );
559 + // Redirections, not found
560 + } else if ( xhr.status == 301 || xhr.status == 302 || xhr.status == 404 ) {
561 + alert( message +'<br />'+ cpi18n.notfound_error );
562 + // Forbidden
563 + } else if ( xhr.status == 403 ) {
564 + alert( message +'<br />'+ cpi18n.forbidden_error );
565 + // Internal error
566 + } else if ( xhr.status == 500 ) {
567 + alert( message +'<br />'+ cpi18n.internal_error +'.<br />'+ cpi18n.timeout_error );
568 + } else {
569 + alert( cpi18n.http_error +' '+ xhr.status +' '+ err );
570 + }
571 + return;
572 +
573 + } else {
574 + alert( cpi18n.unknown_error +' '+ err );
575 + return;
576 + }
577 + }
578 + return;
579 + }
580 + });
581 +}
582 +
345 583 // =====================================================================
346 584 // Plugins/Theme chart.
347 585
348 586 function cpjs_plugins_chart( caxis, clabel, cdata, ctotal_time ) {
@@ -349,9 +587,9 @@
349 587 'use strict';
350 588 // Switch between vertical and horizontal bars
351 589 var _indexAxis = caxis;
352 590 document.getElementById('htov').onclick = function() {
353 - if ( _indexAxis == 'x' ) {
591 + if ( _indexAxis == 'x') {
354 592 _indexAxis = 'y';
355 593 } else {
356 594 _indexAxis = 'x';
357 595 }
@@ -360,11 +598,8 @@
360 598 type: 'bar',
361 599 options: {
362 600 animation: {
363 601 duration: 1000,
364 - onComplete: function() {
365 - document.getElementById('download-png-img').href = myChart.toBase64Image();
366 - }
367 602 },
368 603 indexAxis: _indexAxis,
369 604 plugins: chartPlugins
370 605 },
@@ -390,15 +625,15 @@
390 625 const total_time = ctotal_time;
391 626 const footer = (tooltipItems) => {
392 627 var sum;
393 628 tooltipItems.forEach(function(tooltipItem) {
394 - if ( _indexAxis == 'x' ) {
629 + if ( _indexAxis == 'x') {
395 630 sum = Math.round( ( tooltipItem.parsed.y / total_time ) * 100 );
396 631 } else {
397 632 sum = Math.round( ( tooltipItem.parsed.x / total_time ) * 100 );
398 633 }
399 634 });
400 - return '('+ sum + cpi18n.pc_plugins +')';
635 + return sum + cpi18n.pc_plugins;
401 636 };
402 637
403 638 var chartPlugins = {
404 639 title: {
@@ -445,9 +680,8 @@
445 680 animation: {
446 681 duration: 700,
447 682 onComplete: function() {
448 683 jQuery('#cp-footer-buttons').slideDown(200);
449 - document.getElementById('download-png-img').href = myChart.toBase64Image();
450 684 }
451 685 },
452 686 indexAxis: _indexAxis,
453 687 plugins: chartPlugins
@@ -453,8 +687,15 @@
453 687 plugins: chartPlugins
454 688 },
455 689 plugins:[plugin]
456 690 });
691 +
692 + document.getElementById('download-png-img').onclick = function() {
693 + var a = document.createElement('a');
694 + a.href = myChart.toBase64Image();
695 + a.download = jQuery('#download-png-img').attr('download');
696 + a.click();
697 + }
457 698 }
458 699
459 700 // =====================================================================
460 701 // File I/O chart.
@@ -463,9 +704,9 @@
463 704 'use strict';
464 705 // Switch between vertical and horizontal bars
465 706 var _indexAxis = caxis;
466 707 document.getElementById('htov').onclick = function() {
467 - if ( _indexAxis == 'x' ) {
708 + if ( _indexAxis == 'x') {
468 709 _indexAxis = 'y';
469 710 } else {
470 711 _indexAxis = 'x';
471 712 }
@@ -474,11 +715,8 @@
474 715 type: 'line',
475 716 options: {
476 717 animation: {
477 718 duration: 1000,
478 - onComplete: function() {
479 - document.getElementById('download-png-img').href = myChart.toBase64Image();
480 - }
481 719 },
482 720 indexAxis: _indexAxis,
483 721 plugins: chartPlugins
484 722 },
@@ -546,9 +784,8 @@
546 784 animation: {
547 785 duration: 700,
548 786 onComplete: function() {
549 787 jQuery('#cp-footer-buttons').slideDown(200);
550 - document.getElementById('download-png-img').href = myChart.toBase64Image();
551 788 }
552 789 },
553 790 indexAxis: _indexAxis,
554 791 plugins: chartPlugins
@@ -555,8 +792,15 @@
555 792 },
556 793 plugins:[plugin]
557 794 });
558 795
796 + document.getElementById('download-png-img').onclick = function() {
797 + var a = document.createElement('a');
798 + a.href = myChart.toBase64Image();
799 + a.download = jQuery('#download-png-img').attr('download');
800 + a.click();
801 + }
802 +
559 803 }
560 804 // =====================================================================
561 805 // Disk I/O chart.
562 806
@@ -564,9 +808,9 @@
564 808 'use strict';
565 809 // Switch between vertical and horizontal bars
566 810 var _indexAxis = caxis;
567 811 document.getElementById('htov').onclick = function() {
568 - if ( _indexAxis == 'x' ) {
812 + if ( _indexAxis == 'x') {
569 813 _indexAxis = 'y';
570 814 } else {
571 815 _indexAxis = 'x';
572 816 }
@@ -575,11 +819,8 @@
575 819 type: 'line',
576 820 options: {
577 821 animation: {
578 822 duration: 1000,
579 - onComplete: function() {
580 - document.getElementById('download-png-img').href = myChart.toBase64Image();
581 - }
582 823 },
583 824 indexAxis: _indexAxis,
584 825 plugins: chartPlugins
585 826 },
@@ -646,9 +887,8 @@
646 887 animation: {
647 888 duration: 700,
648 889 onComplete: function() {
649 890 jQuery('#cp-footer-buttons').slideDown(200);
650 - document.getElementById('download-png-img').href = myChart.toBase64Image();
651 891 }
652 892 },
653 893 indexAxis: _indexAxis,
654 894 plugins: chartPlugins
@@ -654,8 +894,24 @@
654 894 plugins: chartPlugins
655 895 },
656 896 plugins:[plugin]
657 897 });
898 +
899 + document.getElementById('download-png-img').onclick = function() {
900 + var a = document.createElement('a');
901 + a.href = myChart.toBase64Image();
902 + a.download = jQuery('#download-png-img').attr('download');
903 + a.click();
904 + }
905 +}
906 +
907 +// =====================================================================
908 +// Settings page
909 +
910 +function cpjs_copy_textarea( id ) {
911 + document.getElementById(id).select();
912 + document.execCommand('copy');
913 + alert( cpi18n.text_copied );
658 914 }
659 915
660 916 // =====================================================================
661 917 // EOF