PluginProbe
Leyka / 3.0
Leyka v3.0
3.32.3 2.3.2 2.3.3 2.3.4 2.3.5 2.3.6 2.3.6.1 2.3.7 2.3.8 2.3.9 3.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1 3.10 3.11 3.11.1 3.12 3.13 3.14 3.15 3.16 3.17 All 89 releases
leyka / js / admin.js

admin.js in Leyka 3.0, at js/admin.js

620 lines 22.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 jQuery(document).ready(function($){
2
3 // Plugin metaboxes rendering:
4 function leyka_support_metaboxes(metabox_area) {
5
6 $('.if-js-closed').removeClass('if-js-closed').addClass('closed'); // Close postboxes that should be closed
7 postboxes.add_postbox_toggles(metabox_area);
8 }
9
10 // Auto-select the code to embed:
11 $('.embed-code').on('focus.leyka keyup.leyka', function(e){
12
13 var keycode = e.keyCode ? e.keyCode : e.which ? e.which : e.charCode;
14
15 if( !keycode || keycode == 9 ) { // Click or tab
16
17 var $this = $(this);
18 $this.select();
19
20 $this.on('mouseup', function() { // Work around Chrome's little problem
21
22 $this.off('mouseup');
23 return false;
24
25 });
26 }
27 });
28
29 $('.read-only').on('keydown.leyka', function(e){ // Keep the field value from manual changing
30
31 if( // Allowed special keys
32 e.keyCode == 9 || // Tab
33 (e.keyCode == 65 && e.ctrlKey) || // Ctrl+A
34 (e.keyCode == 67 && e.ctrlKey) || // Ctrl+C
35 (e.keyCode >= 35 && e.keyCode <= 40) // Home, end, left, right, down, up
36 ) {
37 return; // Let it happen
38 }
39
40 e.preventDefault();
41
42 });
43
44 var $body = $('body');
45
46 if($body.hasClass('toplevel_page_leyka')) { // Leyka desktop page
47 leyka_support_metaboxes('toplevel_page_leyka');
48 } else {
49
50 $.each($body.attr('class').split(' '), function(){
51
52 if(this.indexOf('_page_leyka_settings') >= 0) { // Leyka payment settings page
53
54 leyka_support_metaboxes('leyka_payment_settings_page');
55 return false; // To break the loop
56 }
57 });
58 }
59
60 // // Payment settings page:
61 // if($('#payment-settings-area').length) {
62
63 // Yandex.Kassa settings:
64 // jQuery(document).ready(function($){
65
66 // var $gateway_settings = $('#payment-settings-area').find('#gateway-yandex');
67 //
68 // if($gateway_settings.length) {
69 //
70 // $gateway_settings.find('input[name="leyka_yandex_new_api"]')
71 // .on('change.leyka', function(){
72 //
73 // if($(this).prop('checked')) {
74 //
75 // $gateway_settings.find('.new-api').show();
76 // $gateway_settings.find('.old-api').hide();
77 //
78 // } else {
79 //
80 // $gateway_settings.find('.new-api').hide();
81 // $gateway_settings.find('.old-api').show();
82 //
83 // }
84 //
85 // }).change();
86 //
87 // }
88
89 // });
90 //
91 // var $gateways_accordion = $('#pm-settings-wrapper');
92 // $gateways_accordion.accordion({
93 // heightStyle: 'content',
94 // header: '.gateway-settings > h3',
95 // collapsible: true,
96 // activate: function(event, ui){
97 //
98 // var $header_clicked = $(this).find('.ui-state-active');
99 // if($header_clicked.length) {
100 // $('html, body').animate({ // 35px is a height of the WP admin bar:
101 // scrollTop: $header_clicked.parent().offset().top - 35
102 // }, 250);
103 // }
104 // }
105 // });
106 //
107 // $gateways_accordion.find('.doc-link').click(function(e){
108 // e.stopImmediatePropagation(); // Do not toggle the accordion panel when clicking on the docs link
109 // });
110 //
111 // /** Gateways & PM folding on click by the active PM checkboxes. Also PM ordering */
112 // var $pm_order = $('#pm-order-settings').sortable({placeholder: '', items: '> li:visible'});
113 // $pm_order.on('sortupdate', function(event){
114 //
115 // $('input[name="leyka_pm_order"]').val( $(this).sortable('serialize', {
116 // key: 'pm_order[]', attribute: 'data-pm-id', expression: /(.+)/
117 // }) );
118 // });
119 //
120 // $('.pm-active').click(function(){
121 //
122 // var $this = $(this),
123 // $gateway_metabox = $this.parents('.postbox'),
124 // gateway_id = $gateway_metabox.attr('id').replace('leyka_payment_settings_gateway_', ''),
125 // $gateway_settings = $('#gateway-'+gateway_id);
126 //
127 // // Show/hide a PM settings:
128 // $('#pm-'+$this.attr('id')).toggle();
129 //
130 // var $sortable_pm = $('.pm-order[data-pm-id="'+$this.attr('id')+'"]');
131 //
132 // // Add/remove a sortable block from the PM order settings:
133 // if($this.attr('checked')) {
134 //
135 // if($sortable_pm.length) {
136 // $sortable_pm.show();
137 // } else {
138 //
139 // $sortable_pm = $("<div />").append($pm_order.find('.pm-order[data-pm-id="#FID#"]').clone()).html()
140 // .replace(/#FID#/g, $this.attr('id'))
141 // .replace(/#L#/g, $this.data('pm-label'))
142 // .replace(/#LB#/g, $this.data('pm-label-backend'));
143 // $sortable_pm = $($sortable_pm).removeAttr('style');
144 //
145 // $pm_order.append($sortable_pm);
146 // }
147 // } else {
148 // $sortable_pm.hide();
149 // }
150 // $pm_order.sortable('refresh').sortable('refreshPositions');
151 // $pm_order.trigger('sortupdate');
152 //
153 // // Show/hide a whole gateway settings if there are no PMs from it selected:
154 // if( !$gateway_metabox.find('input:checked').length ) {
155 //
156 // $gateway_settings.hide();
157 // $gateways_accordion.accordion('refresh');
158 //
159 // } else if( !$gateway_settings.is(':visible') ) {
160 //
161 // $gateway_settings.show();
162 // $gateways_accordion.accordion('refresh');
163 //
164 // $sortable_pm.show();
165 // $pm_order.sortable('refresh').sortable('refreshPositions');
166 // $pm_order.trigger('sortupdate');
167 // }
168 // });
169 //
170 // // PM renaming (changing labels) fields:
171 // $pm_order.on('click', '.pm-change-label', function(e){
172 //
173 // e.preventDefault();
174 //
175 // var $this = $(this),
176 // $wrapper = $this.parents('li:first');
177 //
178 // $this.hide();
179 // $wrapper.find('.pm-label').hide();
180 // $wrapper.find('.pm-label-fields').show();
181 // });
182 // $pm_order.on('click', '.new-pm-label-ok,.new-pm-label-cancel', function(e){
183 //
184 // e.preventDefault();
185 //
186 // var $this = $(this),
187 // $wrapper = $this.parents('li:first'),
188 // $pm_label_wrapper = $wrapper.find('.pm-label'),
189 // new_pm_label = $wrapper.find('input[id*="pm_label"]').val();
190 //
191 // if($this.hasClass('new-pm-label-ok')) {
192 // $pm_label_wrapper.text(new_pm_label);
193 // $wrapper.find('input.pm-label-field').val(new_pm_label);
194 // } else {
195 // $wrapper.find('input[id*="pm_label"]').val($pm_label_wrapper.text());
196 // }
197 //
198 // $pm_label_wrapper.show();
199 // $wrapper.find('.pm-label-fields').hide();
200 // $wrapper.find('.pm-change-label').show();
201 //
202 // }).on('keydown', 'input[id*="pm_label"]', function(e){
203 //
204 // var keycode = e.keyCode ? e.keyCode : e.which ? e.which : e.charCode;
205 // if(keycode == 13) { // Enter pressed - stop settings form from being submitted, but save PM custom label
206 //
207 // e.preventDefault();
208 // $(this).parents('.pm-label-fields').find('.new-pm-label-ok').click();
209 // }
210 // });
211 //
212 // $('.pm-order-panel').stick_in_parent({offset_top: 0});
213 // }
214 // Payment settings page:
215 if($('#payment-settings-area').length) {
216
217 // Yandex.Kassa settings:
218 // jQuery(document).ready(function($){
219
220 var $gateway_settings = $('#payment-settings-area').find('#gateway-yandex');
221
222 if($gateway_settings.length) {
223
224 $gateway_settings.find('input[name="leyka_yandex_new_api"]')
225 .on('change.leyka', function(){
226
227 if($(this).prop('checked')) {
228
229 $gateway_settings.find('.new-api').show();
230 $gateway_settings.find('.old-api').hide();
231
232 } else {
233
234 $gateway_settings.find('.new-api').hide();
235 $gateway_settings.find('.old-api').show();
236
237 }
238
239 }).change();
240
241 }
242
243 // });
244
245 var $gateways_accordion = $('#pm-settings-wrapper');
246 $gateways_accordion.accordion({
247 heightStyle: 'content',
248 header: '.gateway-settings > h3',
249 collapsible: true,
250 activate: function(event, ui){
251
252 var $header_clicked = $(this).find('.ui-state-active');
253 if($header_clicked.length) {
254 $('html, body').animate({ // 35px is a height of the WP admin bar:
255 scrollTop: $header_clicked.parent().offset().top - 35
256 }, 250);
257 }
258 }
259 });
260
261 $gateways_accordion.find('.doc-link').click(function(e){
262 e.stopImmediatePropagation(); // Do not toggle the accordion panel when clicking on the docs link
263 });
264
265 /** Gateways & PM folding on click by the active PM checkboxes. Also PM ordering */
266 var $pm_order = $('#pm-order-settings').sortable({placeholder: '', items: '> li:visible'});
267 $pm_order.on('sortupdate', function(event){
268
269 $('input[name="leyka_pm_order"]').val( $(this).sortable('serialize', {
270 key: 'pm_order[]', attribute: 'data-pm-id', expression: /(.+)/
271 }) );
272 });
273
274 $('.pm-active').click(function(){
275
276 var $this = $(this),
277 $gateway_metabox = $this.parents('.postbox'),
278 gateway_id = $gateway_metabox.attr('id').replace('leyka_payment_settings_gateway_', ''),
279 $gateway_settings = $('#gateway-'+gateway_id);
280
281 // Show/hide a PM settings:
282 $('#pm-'+$this.attr('id')).toggle();
283
284 var $sortable_pm = $('.pm-order[data-pm-id="'+$this.attr('id')+'"]');
285
286 // Add/remove a sortable block from the PM order settings:
287 if($this.attr('checked')) {
288
289 if($sortable_pm.length) {
290 $sortable_pm.show();
291 } else {
292
293 $sortable_pm = $("<div />").append($pm_order.find('.pm-order[data-pm-id="#FID#"]').clone()).html()
294 .replace(/#FID#/g, $this.attr('id'))
295 .replace(/#L#/g, $this.data('pm-label'))
296 .replace(/#LB#/g, $this.data('pm-label-backend'));
297 $sortable_pm = $($sortable_pm).removeAttr('style');
298
299 $pm_order.append($sortable_pm);
300 }
301 } else {
302 $sortable_pm.hide();
303 }
304 $pm_order.sortable('refresh').sortable('refreshPositions');
305 $pm_order.trigger('sortupdate');
306
307 // Show/hide a whole gateway settings if there are no PMs from it selected:
308 if( !$gateway_metabox.find('input:checked').length ) {
309
310 $gateway_settings.hide();
311 $gateways_accordion.accordion('refresh');
312
313 } else if( !$gateway_settings.is(':visible') ) {
314
315 $gateway_settings.show();
316 $gateways_accordion.accordion('refresh');
317
318 $sortable_pm.show();
319 $pm_order.sortable('refresh').sortable('refreshPositions');
320 $pm_order.trigger('sortupdate');
321 }
322 });
323
324 // PM renaming (changing labels) fields:
325 $pm_order.on('click', '.pm-change-label', function(e){
326
327 e.preventDefault();
328
329 var $this = $(this),
330 $wrapper = $this.parents('li:first');
331
332 $this.hide();
333 $wrapper.find('.pm-label').hide();
334 $wrapper.find('.pm-label-fields').show();
335 });
336 $pm_order.on('click', '.new-pm-label-ok,.new-pm-label-cancel', function(e){
337
338 e.preventDefault();
339
340 var $this = $(this),
341 $wrapper = $this.parents('li:first'),
342 $pm_label_wrapper = $wrapper.find('.pm-label'),
343 new_pm_label = $wrapper.find('input[id*="pm_label"]').val();
344
345 if($this.hasClass('new-pm-label-ok')) {
346 $pm_label_wrapper.text(new_pm_label);
347 $wrapper.find('input.pm-label-field').val(new_pm_label);
348 } else {
349 $wrapper.find('input[id*="pm_label"]').val($pm_label_wrapper.text());
350 }
351
352 $pm_label_wrapper.show();
353 $wrapper.find('.pm-label-fields').hide();
354 $wrapper.find('.pm-change-label').show();
355
356 }).on('keydown', 'input[id*="pm_label"]', function(e){
357
358 var keycode = e.keyCode ? e.keyCode : e.which ? e.which : e.charCode;
359 if(keycode == 13) { // Enter pressed - stop settings form from being submitted, but save PM custom label
360
361 e.preventDefault();
362 $(this).parents('.pm-label-fields').find('.new-pm-label-ok').click();
363 }
364 });
365
366 $('.pm-order-panel').stick_in_parent({offset_top: 0});
367 }
368
369 /** Tooltips: */
370 var $tooltips = $body.find('.has-tooltip');
371 if($tooltips.length) {
372 $tooltips.tooltip();
373 }
374
375 /** Manual emails sending: */
376 $('.send-donor-thanks').click(function(e){
377
378 e.preventDefault();
379
380 var $this = $(this),
381 $wrap = $this.parent(),
382 donation_id = $wrap.data('donation-id');
383
384 $this.fadeOut(100, function(){
385 $this.html('<img src="'+leyka.ajax_loader_url+'" />').fadeIn(100);
386 });
387
388 $wrap.load(leyka.ajaxurl, {
389 action: 'leyka_send_donor_email',
390 nonce: $wrap.find('#_leyka_donor_email_nonce').val(),
391 donation_id: donation_id
392 });
393 });
394
395 // Exchange places of donations Export and Filter buttons:
396 $('.wrap a.page-title-action').after($('.donations-export-form').detach());
397
398 /** All campaign selection fields: */
399 var $campaign_select = $('#campaign-select');
400 if($campaign_select.length) {
401
402 $campaign_select.keyup(function(){
403
404 if( !$(this).val() ) {
405 $('#campaign-id').val('');
406 $('#new-donation-purpose').html('');
407 }
408 });
409 $campaign_select.autocomplete({
410 minLength: 1,
411 focus: function(event, ui){
412 $campaign_select.val(ui.item.label);
413 $('#new-donation-purpose').html(ui.item.payment_title);
414
415 return false;
416 },
417 change: function(event, ui){
418 if( !$campaign_select.val() ) {
419 $('#campaign-id').val('');
420 $('#new-donation-purpose').html('');
421 }
422 },
423 close: function(event, ui){
424 if( !$campaign_select.val() ) {
425 $('#campaign-id').val('');
426 $('#new-donation-purpose').html('');
427 }
428 },
429 select: function(event, ui){
430 $campaign_select.val(ui.item.label);
431 $('#campaign-id').val(ui.item.value);
432 $('#new-donation-purpose').html(ui.item.payment_title);
433 return false;
434 },
435 source: function(request, response) {
436 var term = request.term,
437 cache = $campaign_select.data('cache') ? $campaign_select.data('cache') : [];
438
439 if(term in cache) {
440 response(cache[term]);
441 return;
442 }
443
444 request.action = 'leyka_get_campaigns_list';
445 request.nonce = $campaign_select.data('nonce');
446
447 $.getJSON(leyka.ajaxurl, request, function(data, status, xhr){
448
449 var cache = $campaign_select.data('cache') ? $campaign_select.data('cache') : [];
450
451 cache[term] = data;
452 response(data);
453 });
454 }
455 });
456
457 $campaign_select.data('ui-autocomplete')._renderItem = function(ul, item){
458 return $('<li>')
459 .append(
460 '<a>'+item.label+(item.label == item.payment_title ? '' : '<div>'+item.payment_title+'</div></a>')
461 )
462 .appendTo(ul);
463 };
464 }
465
466 $('#leyka_donation_form_mode-field').change(function(e){
467
468 if($(this).attr('checked')) {
469 $('#leyka_scale_widget_place-wrapper, #leyka_donations_history_under_forms-wrapper')
470 .find(':input').removeAttr('disabled');
471 } else {
472 $('#leyka_scale_widget_place-wrapper, #leyka_donations_history_under_forms-wrapper')
473 .find(':input').attr('disabled', 'disabled');
474 }
475
476 }).change();
477
478 $('#leyka_auto_refresh_currency_rates-field').change(function(e){
479 if($(this).attr('checked')) {
480 $('#leyka_currency_rur2usd-wrapper, #leyka_currency_rur2eur-wrapper')
481 .find(':input').attr('disabled', 'disabled');
482 } else {
483 $('#leyka_currency_rur2usd-wrapper, #leyka_currency_rur2eur-wrapper')
484 .find(':input').removeAttr('disabled');
485 }
486 }).change();
487
488 /** Feedback form */
489 var $form = $('#feedback'),
490 $loader = $('#feedback-loader'),
491 $message_ok = $('#message-ok'),
492 $message_error = $('#message-error');
493
494 $form.submit(function(e){
495
496 e.preventDefault();
497
498 if( !validate_feedback_form() ) {
499 return false;
500 }
501
502 $form.hide();
503 $loader.show();
504
505 $.post(leyka.ajaxurl, {
506 action: 'leyka_send_feedback',
507 topic: $form.find('#feedback-topic').val(),
508 name: $form.find('#feedback-name').val(),
509 email: $form.find('#feedback-email').val(),
510 text: $form.find('#feedback-text').val(),
511 nonce: $form.find('#nonce').val()
512 }, function(response){
513
514 $loader.hide();
515
516 if(response && response == 0)
517 $message_ok.fadeIn(100);
518 else
519 $message_error.fadeIn(100);
520 });
521
522 return true;
523 });
524
525 function validate_feedback_form() {
526
527 var $form = $('#feedback'),
528 is_valid = true,
529 $field = $form.find('#feedback-topic');
530
531 if( !$field.val() ) {
532
533 is_valid = false;
534 $form.find('#'+$field.attr('id')+'-error').html(leyka.field_required).show();
535
536 } else
537 $form.find('#'+$field.attr('id')+'-error').html('').hide();
538
539 $field = $form.find('#feedback-name');
540 if( !$field.val() ) {
541
542 is_valid = false;
543 $form.find('#'+$field.attr('id')+'-error').html(leyka.field_required).show();
544
545 } else
546 $form.find('#'+$field.attr('id')+'-error').html('').hide();
547
548 $field = $form.find('#feedback-email');
549 if( !$field.val() ) {
550
551 is_valid = false;
552 $form.find('#'+$field.attr('id')+'-error').html(leyka.field_required).show();
553
554 } else if( !is_email($field.val()) ) {
555
556 is_valid = false;
557 $form.find('#'+$field.attr('id')+'-error').html(leyka.email_invalid).show();
558
559 } else
560 $form.find('#'+$field.attr('id')+'-error').html('').hide();
561
562 $field = $form.find('#feedback-text');
563 if( !$field.val() ) {
564
565 is_valid = false;
566 $form.find('#'+$field.attr('id')+'-error').html(leyka.field_required).show();
567
568 } else
569 $form.find('#'+$field.attr('id')+'-error').html('').hide();
570
571 return is_valid;
572 }
573 });
574
575 /** @var e JS keyup/keydown event */
576 function leyka_is_digit_key(e, numpad_allowed) {
577
578 if(typeof numpad_allowed == 'undefined') {
579 numpad_allowed = true;
580 } else {
581 numpad_allowed = !!numpad_allowed;
582 }
583
584 if( // Allowed special keys
585 e.keyCode == 46 || e.keyCode == 8 || e.keyCode == 9 || e.keyCode == 13 || // Backspace, delete, tab, enter
586 (e.keyCode == 65 && e.ctrlKey) || // Ctrl+A
587 (e.keyCode == 67 && e.ctrlKey) || // Ctrl+C
588 (e.keyCode >= 35 && e.keyCode <= 40) // Home, end, left, right, down, up
589 ) {
590 return true;
591 }
592
593 if(numpad_allowed) {
594 if( !e.shiftKey && e.keyCode >= 48 && e.keyCode <= 57 ) {
595 return true;
596 } else {
597 return e.keyCode >= 96 && e.keyCode <= 105;
598 }
599 } else {
600 return !(e.shiftKey || e.keyCode < 48 || e.keyCode > 57);
601 }
602
603 }
604
605 /** @var e JS keyup/keydown event */
606 function leyka_is_special_key(e) {
607
608 // Allowed special keys
609 return (
610 e.keyCode === 9 || // Tab
611 (e.keyCode === 65 && e.ctrlKey) || // Ctrl+A
612 (e.keyCode === 67 && e.ctrlKey) || // Ctrl+C
613 (e.keyCode >= 35 && e.keyCode <= 40) // Home, end, left, right, down, up
614 );
615 }
616
617 function is_email(email) {
618 return /^([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x22([^\x0d\x22\x5c\x80-\xff]|\x5c[\x00-\x7f])*\x22)(\x2e([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x22([^\x0d\x22\x5c\x80-\xff]|\x5c[\x00-\x7f])*\x22))*\x40([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x5b([^\x0d\x5b-\x5d\x80-\xff]|\x5c[\x00-\x7f])*\x5d)(\x2e([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x5b([^\x0d\x5b-\x5d\x80-\xff]|\x5c[\x00-\x7f])*\x5d))*$/.test(email);
619 }
620