PluginProbe
GamiPress – Gamification plugin to reward points, badges & ranks in WordPress, now with AI / 7.9.8
GamiPress – Gamification plugin to reward points, badges & ranks in WordPress, now with AI v7.9.8
8.0.4 8.0.3 8.0.1 8.0.2 8.0.0 7.9.9.7 7.9.9.6 7.9.9.5 7.9.9.4 7.9.9.3 7.9.9.2 7.9.9.1 7.9.9 7.9.8 7.9.7 7.9.6 7.9.5 7.9.4 7.9.3 7.9.2 7.9.1 7.9.0 7.8.9 7.8.8 7.8.7 All 46 releases
gamipress / assets / js / gamipress-admin-tools.js

gamipress-admin-tools.js in GamiPress – Gamification plugin to reward points, badges & ranks in WordPress, now with AI 7.9.8, at assets/js/gamipress-admin-tools.js

1,102 lines 42.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 (function( $ ) {
2
3 // ----------------------------------
4 // Bulk Awards/Revokes Tool
5 // ----------------------------------
6
7 // On change requirement type
8 $('#bulk-awards, #bulk-revokes').on('change', '#bulk_award_requirements_type, #bulk_revoke_requirements_type', function() {
9
10 var target = $(this).closest('.cmb-row').next().find('select[data-post-type]');
11 var post_type = $(this).val();
12
13
14 if( post_type !== '' ) {
15 target.val('').change();
16 target.data('post-type', post_type)
17 }
18 });
19
20 function gamipress_run_bulk_tool( button, loop ) {
21
22 // Initialize loop
23 if( loop === undefined ) loop = 0;
24
25 var response_id = button.attr('id').replace('_button', '_response');
26 var active_tab = button.closest('.cmb-tabs-wrap').find('.cmb-tab.active');
27 var action = ( button.attr('id').indexOf('bulk_award_') !== -1 ? 'bulk_award' : 'bulk_revoke' );
28 var data;
29
30 if( action === 'bulk_award' ) {
31 data = {
32 action: 'gamipress_bulk_awards_tool',
33 nonce: gamipress_admin_tools.nonce,
34 bulk_award: button.attr('id').replace('bulk_award_', '').replace('_button', ''),
35 loop: loop
36 };
37 } else if( action === 'bulk_revoke' ) {
38 data = {
39 action: 'gamipress_bulk_revokes_tool',
40 nonce: gamipress_admin_tools.nonce,
41 bulk_revoke: button.attr('id').replace('bulk_revoke_', '').replace('_button', ''),
42 loop: loop
43 };
44 }
45
46 // Loop all fields to build the request data
47 $(active_tab.data('fields')).find('input, select, textarea').each(function() {
48
49 if( $(this).attr('type') === 'checkbox' ) {
50 // Checkboxes are sent just when checked
51 if( $(this).prop('checked') )
52 data[$(this).attr('name')] = $(this).val();
53 } else {
54 data[$(this).attr('name')] = $(this).val();
55 }
56
57 });
58
59 // Disable the button
60 button.prop('disabled', true);
61
62 if( ! $('#' + response_id).length )
63 button.parent().append('<span id="' + response_id + '" style="display: inline-block; padding: 5px 0 0 8px;"></span>');
64
65 // Show the spinner
66 if( loop === 0 )
67 $('#' + response_id).html('<span class="spinner is-active" style="float: none; margin: 0;"></span>');
68
69 $.post(
70 ajaxurl,
71 data,
72 function( response ) {
73
74 // Run again utility
75 if( response.data.run_again !== undefined && response.data.run_again && response.success === true ) {
76
77 // Keep the spinner and add the server response
78 $('#' + response_id).html(
79 '<span class="spinner is-active" style="float: none; margin: 0;"></span>'
80 + '<span style="display: inline-block; padding-left: 5px;">' + ( response.data.message !== undefined ? response.data.message : response.data ) + '</span>'
81 );
82
83 loop++;
84
85 // Run again passing the next loop index
86 gamipress_run_bulk_tool( button, loop );
87
88 return;
89 }
90
91 // Update response color text
92 if( response.success === false )
93 $('#' + response_id).css({color:'#a00'});
94 else
95 $('#' + response_id).css({color:''});
96
97 // Add the server response
98 $('#' + response_id).html(response.data);
99
100 // Increase loop count
101 if( response.success !== false )
102 loop++;
103
104 // Enable the button
105 button.prop('disabled', false);
106 }
107 ).fail(function() {
108
109 $('#' + response_id).html('The server has returned an internal error.');
110
111 // Enable the button
112 button.prop('disabled', false);
113 });
114
115 }
116
117 $('#bulk_award_points_button, #bulk_award_achievements_button, #bulk_award_rank_button, #bulk_award_requirements_button, '
118 + '#bulk_revoke_points_button, #bulk_revoke_achievements_button, #bulk_revoke_rank_button, #bulk_revoke_requirements_button').on('click', function(e) {
119 e.preventDefault();
120
121 gamipress_run_bulk_tool( $(this) );
122 });
123
124 // ----------------------------------
125 // Recount Activity Tool
126 // ----------------------------------
127
128 function gamipress_run_recount_activity_tool( loop ) {
129
130 if( loop === undefined )
131 loop = 0;
132
133 var button = $("#recount_activity");
134 var activity = $('#activity_to_recount').val();
135 var limit = $('#entries_per_loop').val();
136
137 $.post(
138 ajaxurl,
139 {
140 action: 'gamipress_recount_activity_tool',
141 nonce: gamipress_admin_tools.nonce,
142 activity: activity,
143 limit: limit,
144 loop: loop // Used on run again utility to let know to the tool in which loop we are now
145 },
146 function( response ) {
147
148 // Run again utility
149 if( response.data.run_again !== undefined && response.data.run_again && response.success === true ) {
150
151 var running_selector = '#recount-activity-response #running-' + activity;
152
153 if( ! $(running_selector).length )
154 $('#recount-activity-response').append( '<span id="running-' + activity + '"></span>' );
155
156 $(running_selector).html( ( response.data.message !== undefined ? response.data.message : response.data ) );
157
158 if( response.data.log !== undefined && response.data.log.length ) {
159 if( ! $('#recount-activity-log').length )
160 $(
161 '<div id="recount-activity-log">'
162 + '<p>'
163 + '<a href="#" id="recount-activity-log-toggle">Show log</a>'
164 + ' | '
165 + '<a href="#" id="recount-activity-log-download">Download log</a>'
166 + '</p>'
167 + '<div id="recount-activity-log-content" style="display: none;"></div>'
168 + '</div>'
169 ).insertAfter( $('#recount-activity-response') );
170
171 $('#recount-activity-log-content').append( response.data.log );
172 }
173
174 loop++;
175
176 // Run again passing the next loop index
177 gamipress_run_recount_activity_tool( loop );
178
179 return;
180 }
181
182 $('#recount-activity-notice').remove();
183
184 if( response.success === false )
185 $('#recount-activity-response').css({color:'#a00'});
186 else
187 $('#recount-activity-response').css({color:''});
188
189 $('#recount-activity-response').html(response.data);
190
191 // Enable the button and the activity select
192 button.prop('disabled', false);
193 $('#activity_to_recount').prop('disabled', false);
194 }
195 ).fail(function() {
196
197 $('#recount-activity-notice').remove();
198
199 $('#recount-activity-response').html('The server has returned an internal error.');
200
201 if( $('#recount-activity-log').length )
202 $('#recount-activity-log-content').append('The server has returned an internal error.');
203
204 // Enable the button and the activity select
205 button.prop('disabled', false);
206 $('#activity_to_recount').prop('disabled', false);
207 });
208 }
209
210 $("#recount_activity").on('click', function(e) {
211 e.preventDefault();
212
213 $('#recount-activity-warning').remove();
214
215 if( $('#activity_to_recount').val() === '' ) {
216 $(this).parent().prepend('<p id="recount-activity-warning" class="cmb2-metabox-description" style="color: #a00;">You need to choose an activity to recount.</p>');
217 return false;
218 }
219
220 var $this = $(this);
221
222 // Disable the button and the activity select
223 $this.prop('disabled', true);
224 $('#activity_to_recount').prop('disabled', true);
225
226 // Reset the activity log
227 if( $('#recount-activity-log').length )
228 $('#recount-activity-log').remove();
229
230 // Show a notice to let know to the user that process could take a while
231 $this.parent().prepend('<p id="recount-activity-notice" class="cmb2-metabox-description">' + gamipress_admin_tools.recount_activity_notice + '</p>');
232
233 if( ! $('#recount-activity-response').length )
234 $this.parent().append('<span id="recount-activity-response"></span>');
235
236 // Show the spinner
237 $('#recount-activity-response').html('<span class="spinner is-active" style="float: none;"></span>');
238
239 // Make the ajax request
240 gamipress_run_recount_activity_tool();
241 });
242
243 // Activity log toggle
244 $('body').on('click', '#recount-activity-log-toggle', function(e) {
245 e.preventDefault();
246
247 $('#recount-activity-log-content').toggle();
248
249 if( $(this).text() === 'Show log' ) {
250 $(this).text( 'Hide log' );
251 } else {
252 $(this).text( 'Show log' );
253 }
254 });
255
256 // Download activity log
257 $('body').on('click', '#recount-activity-log-download', function(e) {
258 e.preventDefault();
259
260 var activity = $('#activity_to_recount').val();
261
262 gamipress_download_file( $('#recount-activity-log-content').text(), 'gamipress-activity-recount-' + activity, 'log' );
263 });
264
265 // ----------------------------------
266 // Logs Clean Up Tool
267 // ----------------------------------
268
269 $('#logs_clean_up_count, #logs_clean_up').on('click', function(e) {
270 e.preventDefault();
271
272 var $this = $(this);
273 var form = $this.closest('#cmb2-metabox-logs-clean-up');
274 var id = $this.attr('id');
275 var response_id = 'logs-clean-up-response';
276 var log_types = [];
277 var from = form.find('input[name="from"]').val();
278 var to = form.find('input[name="to"]').val();
279 var error = '';
280
281 form.find('input[name="logs_type[]"]:checked').each(function() {
282 log_types.push( $(this).val() )
283 });
284
285 if( log_types.length === 0 )
286 error = 'Please, choose at least 1 log type.';
287
288 if( ! $('#' + response_id).length )
289 $this.parent().append('<span id="' + response_id + '" style="display: inline-block; padding: 5px 0 0 8px;"></span>');
290
291 // Remove error messages
292 $('#' + response_id).html('');
293
294 // If there is any error, show it to the user
295 if( error !== '' ) {
296 $('#' + response_id).css({color:'#a00'});
297 $('#' + response_id).html(error);
298 return false;
299 }
300
301 // Disable both buttons
302 $('#logs_clean_up_count, #logs_clean_up').prop('disabled', true);
303
304 // Show the spinner
305 $('#' + response_id).html('<span class="spinner is-active" style="float: none; margin: 0;"></span>');
306
307 $.post(
308 ajaxurl,
309 {
310 action: 'gamipress_' + id + '_tool',
311 nonce: gamipress_admin_tools.nonce,
312 log_types: log_types,
313 from: from,
314 to: to
315 },
316 function( response ) {
317
318 if( ! $('#' + response_id).length )
319 $this.parent().append('<span id="' + response_id + '" style="display: inline-block; padding: 5px 0 0 8px;"></span>');
320
321 // Update response color text
322 if( response.success === false )
323 $('#' + response_id).css({color:'#a00'});
324 else
325 $('#' + response_id).css({color:''});
326
327 $('#' + response_id).html( ( response.data.message !== undefined ? response.data.message : response.data ) );
328
329 // Enable the buttons
330 $('#logs_clean_up_count, #logs_clean_up').prop('disabled', false);
331 }
332 ).fail(function() {
333
334 $('#' + response_id).html('The server has returned an internal error.');
335
336 // Enable the buttons
337 $('#logs_clean_up_count, #logs_clean_up').prop('disabled', false);
338 });
339
340 });
341
342 // ----------------------------------
343 // Reset Data Tool
344 // ----------------------------------
345
346 var reset_data_dialog = $("#reset-data-dialog");
347
348 reset_data_dialog.dialog({
349 dialogClass : 'wp-dialog',
350 modal : true,
351 autoOpen : false,
352 closeOnEscape : true,
353 draggable : false,
354 width : 500,
355 buttons : [
356 {
357 text: "Yes, delete it permanently",
358 class: "button-primary reset-data-button",
359 click: function() {
360 $('.reset-data-button').prop('disabled', true);
361
362 if( ! $('#reset-data-response').length )
363 $('.reset-data-button').parent().parent().prepend('<span id="reset-data-response"></span>');
364
365 // Show the spinner
366 $('#reset-data-response').html('<span class="spinner is-active" style="float: none;"></span>');
367
368 var items = [];
369
370 $('.cmb2-id-data-to-reset input:checked').each(function() {
371 items.push($(this).val());
372 });
373
374 $.post(
375 ajaxurl,
376 {
377 action: 'gamipress_reset_data_tool',
378 nonce: gamipress_admin_tools.nonce,
379 items: items
380 },
381 function( response ) {
382
383 if( response.success === false )
384 $('#reset-data-response').css({color:'#a00'});
385 else
386 $('#reset-data-response').css({color:''});
387
388 $('#reset-data-response').html(response.data);
389
390 if( response.success === true ) {
391
392 setTimeout(function() {
393 $('.cmb2-id-data-to-reset input:checked').each(function() {
394 $(this).prop( 'checked', false );
395 });
396
397 reset_data_dialog.dialog( "close" );
398 }, 5000);
399 }
400
401 $('.reset-data-button').prop('disabled', false);
402 }
403 );
404 }
405 },
406 {
407 text: "Cancel",
408 class: "cancel-reset-data-button",
409 click: function() {
410 $( this ).dialog( "close" );
411 }
412 }
413
414 ]
415 });
416
417 $("#reset_data").on('click', function(e) {
418 e.preventDefault();
419
420 $('#reset-data-warning').remove();
421
422 var checked_options = $('.cmb2-id-data-to-reset input:checked');
423
424 if( checked_options.length ) {
425
426 var reminder_html = '';
427
428 checked_options.each(function() {
429 reminder_html += '<li>' + $(this).next().text() + '</li>'
430 });
431
432 // Add a reminder with data to be removed
433 $('#reset-data-reminder').html('<ul>' + reminder_html + '</ul>');
434
435 // Open our dialog
436 reset_data_dialog.dialog('open');
437
438 // Remove the initial jQuery UI Dialog auto focus
439 $('.ui-dialog :button').blur();
440 } else {
441 $(this).parent().prepend('<p id="reset-data-warning" class="cmb2-metabox-description" style="color: #a00;">You need to choose at least one option.</p>');
442 }
443 });
444
445 $('.cmb2-id-data-to-reset').on('change', 'input', function() {
446
447 $('#reset-data-warning').remove();
448
449 var checked_option = $(this).val();
450
451 if( checked_option === 'achievement_types' ) {
452 $('.cmb2-id-data-to-reset input[value="achievements"], .cmb2-id-data-to-reset input[value="steps"]').prop( 'checked', $(this).prop( 'checked' ) );
453 } else if( checked_option === 'achievements' ) {
454 $('.cmb2-id-data-to-reset input[value="steps"]').prop( 'checked', $(this).prop( 'checked' ) );
455 } else if( checked_option === 'points_types' ) {
456 $('.cmb2-id-data-to-reset input[value="points_awards"]').prop( 'checked', $(this).prop( 'checked' ) );
457 $('.cmb2-id-data-to-reset input[value="points_deducts"]').prop( 'checked', $(this).prop( 'checked' ) );
458 } else if( checked_option === 'rank_types' ) {
459 $('.cmb2-id-data-to-reset input[value="ranks"], .cmb2-id-data-to-reset input[value="rank_requirements"]').prop( 'checked', $(this).prop( 'checked' ) );
460 } else if( checked_option === 'ranks' ) {
461 $('.cmb2-id-data-to-reset input[value="rank_requirements"]').prop( 'checked', $(this).prop( 'checked' ) );
462 } else if( checked_option === 'earnings' ) {
463 $('.cmb2-id-data-to-reset input[value="earned_points"], .cmb2-id-data-to-reset input[value="earned_achievements"], .cmb2-id-data-to-reset input[value="earned_ranks"]').prop( 'checked', $(this).prop( 'checked' ) );
464 }
465
466 });
467
468 // ----------------------------------
469 // Export Achievements, Points and Ranks Tool
470 // ----------------------------------
471
472 $('#export_achievements, #export_points, #export_ranks, #export_earnings').on('click', function(e) {
473 e.preventDefault();
474
475 var $this = $(this);
476 var type;
477 var error = '';
478
479 switch( $this.attr('id') ) {
480 case 'export_achievements':
481 // Achievements export
482 type = 'achievements';
483
484 // Check achievement types
485 if( ! $('input[name="export_achievements_achievement_types[]"]:checked').length ) {
486 error = 'You need to choose at least 1 achievement type to export.';
487 }
488 break;
489 case 'export_points':
490 // Points export
491 type = 'points';
492
493 // Check points types
494 if( ! $('input[name="export_points_points_types[]"]:checked').length ) {
495 error = 'You need to choose at least 1 points type to export.';
496 }
497 break;
498 case 'export_ranks':
499 // Ranks export
500 type = 'ranks';
501
502 // Check rank types
503 if( ! $('input[name="export_ranks_rank_types[]"]:checked').length ) {
504 error = 'You need to choose at least 1 rank type to export.';
505 }
506 break;
507 case 'export_earnings':
508 // Ranks export
509 type = 'earnings';
510
511 // Check rank types
512 if( ! $('input[name="export_earnings_types[]"]:checked').length ) {
513 error = 'You need to choose at least 1 type to export.';
514 }
515 break;
516 }
517
518 // Remove error messages
519 $('#export-' + type + '-warning').remove();
520
521 // If there is any error, show it to the user
522 if( error !== '' ) {
523 $this.parent().prepend('<p id="export-' + type + '-warning" class="cmb2-metabox-description" style="color: #a00;">' + error + '</p>');
524 return false;
525 }
526
527 // Reset the data to export
528 to_export = [];
529
530 gamipress_run_export_tool( type );
531
532 });
533
534 var to_export = [];
535
536 // Function to handle the export process
537 function gamipress_run_export_tool( type, loop ) {
538
539 var button_element = $('#export_' + type );
540 var response_element = $('#export-' + type + '-response');
541 var data;
542
543 if( loop === undefined )
544 loop = 0;
545
546 // Disable the export button
547 button_element.prop('disabled', true);
548
549 // Check if response element exists
550 if( ! response_element.length ) {
551 button_element.parent().append('<span id="export-' + type + '-response" style="display: inline-block; padding: 5px 0 0 8px;"></span>');
552
553 response_element = $('#export-' + type + '-response');
554 }
555
556 // Show the spinner
557 if( loop === 0 )
558 response_element.html('<span class="spinner is-active" style="float: none; margin: 0;"></span>');
559
560 // Setup request data per type
561 switch( type ) {
562 case 'achievements':
563 // Achievements data
564 var achievement_types = [];
565
566 $('input[name="export_achievements_achievement_types[]"]:checked').each(function() {
567 achievement_types.push( $(this).val() );
568 });
569
570 data = {
571 action: 'gamipress_import_export_achievements_tool_export',
572 nonce: gamipress_admin_tools.nonce,
573 achievement_types: achievement_types,
574 user_field: $('#export_achievements_user_field').val(),
575 achievement_field: $('#export_achievements_achievement_field').val(),
576 loop: loop
577 };
578 break;
579 case 'points':
580 // Points data
581 var points_types = [];
582
583 $('input[name="export_points_points_types[]"]:checked').each(function() {
584 points_types.push( $(this).val() );
585 });
586
587 data = {
588 action: 'gamipress_import_export_points_tool_export',
589 nonce: gamipress_admin_tools.nonce,
590 points_types: points_types,
591 user_field: $('#export_points_user_field').val(),
592 loop: loop
593 };
594 break;
595 case 'ranks':
596 // Ranks data
597 var rank_types = [];
598
599 $('input[name="export_ranks_rank_types[]"]:checked').each(function() {
600 rank_types.push( $(this).val() );
601 });
602
603 data = {
604 action: 'gamipress_import_export_ranks_tool_export',
605 nonce: gamipress_admin_tools.nonce,
606 rank_types: rank_types,
607 user_field: $('#export_ranks_user_field').val(),
608 rank_field: $('#export_ranks_rank_field').val(),
609 loop: loop
610 };
611 break;
612 case 'earnings':
613 // Ranks data
614 var types = [];
615
616 $('input[name="export_earnings_types[]"]:checked').each(function() {
617 types.push( $(this).val() );
618 });
619
620 data = {
621 action: 'gamipress_import_export_earnings_tool_export',
622 nonce: gamipress_admin_tools.nonce,
623 types: types,
624 user_field: $('#export_earnings_user_field').val(),
625 post_field: $('#export_earnings_post_field').val(),
626 from: $('#export_earnings_from').val(),
627 to: $('#export_earnings_to').val(),
628 loop: loop
629 };
630 break;
631 }
632
633 $.post(
634 ajaxurl,
635 data,
636 function( response ) {
637
638 if( response.data.items !== undefined ) {
639 // Concat received items
640 to_export = to_export.concat( response.data.items );
641 }
642
643 // Run again utility
644 if( response.data.run_again !== undefined && response.data.run_again && response.success === true ) {
645
646 response_element.html( ( response.data.message !== undefined ? response.data.message : response.data ) );
647
648 loop++;
649
650 // Run again passing the next loop index
651 gamipress_run_export_tool( type, loop );
652
653 return;
654 }
655
656 if( response.success === false )
657 response_element.css({color:'#a00'});
658 else
659 response_element.css({color:''});
660
661 response_element.html( ( response.data.message !== undefined ? response.data.message : response.data ) );
662
663 // Enable the export button
664 button_element.prop('disabled', false);
665
666 if( to_export.length ) {
667 // Download the CSV with the data
668 gamipress_download_csv( to_export, 'gamipress-user-' + type + '-export' );
669 }
670 }
671 ).fail(function() {
672
673 response_element.html('The server has returned an internal error.');
674
675 // Enable the export button
676 button_element.prop('disabled', false);
677 });
678
679 }
680
681 // ----------------------------------
682 // Import Achievements, Points and Ranks Tool
683 // ----------------------------------
684
685 $('#import_achievements, #import_points, #import_ranks').on('click', function(e) {
686 e.preventDefault();
687
688 var $this = $(this);
689 var type;
690
691 switch( $this.attr('id') ) {
692 case 'import_achievements':
693 // Achievements import
694 type = 'achievements';
695 break;
696 case 'import_points':
697 // Points import
698 type = 'points';
699 break;
700 case 'import_ranks':
701 // Ranks import
702 type = 'ranks';
703 break;
704 }
705
706 // Remove error messages
707 $('#import-' + type + '-warning').remove();
708
709 // Remove old responses
710 $('#import-' + type + '-response').remove();
711
712 // Check if CSV file has been chosen
713 if( $('#import_' + type + '_file')[0].files[0] === undefined ) {
714 $this.parent().prepend('<p id="import-' + type + '-warning" class="cmb2-metabox-description" style="color: #a00;">You need to choose a CSV file to import.</p>');
715 return false;
716 }
717
718 // Setup the form data to send
719 var form_data = new FormData();
720 form_data.append( 'action', 'gamipress_import_export_' + type + '_tool_import' );
721 form_data.append( 'nonce', gamipress_admin_tools.nonce );
722 form_data.append( 'file', $('#import_' + type + '_file')[0].files[0] );
723
724 // Disable the button
725 $this.prop('disabled', true);
726
727 if( ! $('#import-' + type + '-response').length )
728 $this.parent().prepend('<p id="import-' + type + '-response" class="cmb2-metabox-description"></p>');
729
730 // Show the spinner
731 $('#import-' + type + '-response').html('<span class="spinner is-active" style="float: none;"></span>');
732
733 $.ajax({
734 url: ajaxurl,
735 method: 'post',
736 cache: false,
737 contentType: false,
738 processData: false,
739 data: form_data,
740 success: function(response) {
741
742 // Set a red color to the response to let user known that something is going wrong
743 if( response.success === false )
744 $('#import-' + type + '-response').css({color:'#a00'});
745 else
746 $('#import-' + type + '-response').css({color:''});
747
748 // Update the response content
749 $('#import-' + type + '-response').html( response.data );
750
751 // Re-enable the button
752 $this.prop('disabled', false);
753
754 }
755 });
756
757 });
758
759 // ----------------------------------
760 // Download Achievements, Points and Ranks CSV Template
761 // ----------------------------------
762
763 $('#download_achievements_csv_template, #download_points_csv_template, #download_ranks_csv_template').on('click', function(e) {
764 e.preventDefault();
765
766 var type, sample_data;
767
768 switch( $(this).attr('id') ) {
769 case 'download_achievements_csv_template':
770 // Achievements sample data
771 type = 'achievements';
772 sample_data = [
773 {
774 user: 'User (ID, username or email)',
775 achievements: 'Achievements (Comma-separated list of IDs, titles and/or slugs)',
776 notes: 'Notes (This column won\'t be processed by the tool)',
777 },
778 {
779 user: gamipress_admin_tools.user_id,
780 achievements: '1,2,3',
781 notes: 'Awarding by user ID and passing the achievements IDs',
782 },
783 {
784 user: gamipress_admin_tools.user_name,
785 achievements: 'Test Badge,Custom Quest,Super Achievement',
786 notes: 'Awarding by username and passing the achievements titles',
787 },
788 {
789 user: gamipress_admin_tools.user_email,
790 achievements: 'test-badge,custom-quest,super-achievement',
791 notes: 'Awarding by email and passing the achievements slugs',
792 },
793 {
794 user: gamipress_admin_tools.user_id,
795 achievements: '-1,-Test Badge,-test-badge',
796 notes: 'Adding a negative sign will revoke the achievements',
797 },
798 ];
799 break;
800 case 'download_points_csv_template':
801 // Points sample data
802 type = 'points';
803 sample_data = [
804 {
805 user: 'User (ID, username or email)',
806 points: 'Points',
807 points_type: 'Points Type (slug)',
808 log: 'Log Description (Optional)',
809 notes: 'Notes (This column won\'t be processed by the tool)',
810 },
811 {
812 user: gamipress_admin_tools.user_id,
813 points: '100',
814 points_type: 'credits',
815 log: '100 credits awarded through the user\'s ID',
816 notes: 'Awarding points by user ID',
817 },
818 {
819 user: gamipress_admin_tools.user_name,
820 points: '1000',
821 points_type: 'coins',
822 log: '1,000 coins awarded through the user\'s username',
823 notes: 'Awarding points by username',
824 },
825 {
826 user: gamipress_admin_tools.user_email,
827 points: '50',
828 points_type: 'gems',
829 log: '50 gems awarded through the user\'s email',
830 notes: 'Awarding points by email',
831 },
832 {
833 user: gamipress_admin_tools.user_email,
834 points: '-50',
835 points_type: 'gems',
836 log: '50 gems deducted through the user\'s email',
837 notes: 'Adding a negative sign will deduct the points',
838 },
839 ];
840 break;
841 case 'download_ranks_csv_template':
842 // Ranks sample data
843 type = 'ranks';
844 sample_data = [
845 {
846 user: 'User (ID, username or email)',
847 rank: 'Rank (ID, title or slug of rank to assign to the user)',
848 notes: 'Notes (This column won\'t be processed by the tool)',
849 },
850 {
851 user: gamipress_admin_tools.user_id,
852 rank: '1',
853 notes: 'Setting rank by user ID and passing the rank ID',
854 },
855 {
856 user: gamipress_admin_tools.user_name,
857 rank: 'Test Rank',
858 notes: 'Setting rank by username and passing the rank title',
859 },
860 {
861 user: gamipress_admin_tools.user_email,
862 rank: 'test-rank',
863 notes: 'Setting rank by email and passing the rank slug',
864 },
865 {
866 user: gamipress_admin_tools.user_id,
867 rank: '-1',
868 notes: 'Adding a negative sign will revoke the rank to the user and will try to assign the previous one (following the priority order)',
869 },
870 ];
871 break;
872 }
873
874 if( Array.isArray( sample_data ) ) {
875 gamipress_download_csv( sample_data, 'gamipress-' + type + '-csv-template' );
876 }
877
878 });
879
880 // ----------------------------------
881 // Export Setup Tool
882 // ----------------------------------
883
884 $('.gamipress-all-types-multicheck').on('change', 'input', function() {
885
886 var box = $(this).closest('.cmb2-metabox').attr('id');
887
888 if( box === 'cmb2-metabox-import-export-setup' ) {
889 $('#export-setup-warning').remove();
890 } else if( box === 'cmb2-metabox-import-export-earnings' ) {
891 $('#export-earnings-warning').remove();
892 }
893
894
895 var checked_option = $(this).val();
896 var type = '';
897
898 if( checked_option === 'all-points-types' ) {
899
900 $('.gamipress-all-types-multicheck input[value$="-points-type"]').prop( 'checked', $(this).prop( 'checked' ) );
901 $('.gamipress-all-types-multicheck input[value$="-points-awards"]').prop( 'checked', $(this).prop( 'checked' ) );
902 $('.gamipress-all-types-multicheck input[value$="-points-deducts"]').prop( 'checked', $(this).prop( 'checked' ) );
903
904 } else if( checked_option.endsWith( '-points-type' ) ) {
905
906 type = checked_option.replace( '-points-type', '' );
907 $('.gamipress-all-types-multicheck input[value="' + type + '-points-awards"]').prop( 'checked', $(this).prop( 'checked' ) );
908 $('.gamipress-all-types-multicheck input[value="' + type + '-points-deducts"]').prop( 'checked', $(this).prop( 'checked' ) );
909
910 } else if( checked_option === 'all-achievement-types' ) {
911
912 $('.gamipress-all-types-multicheck input[value$="-achievement-type"]').prop( 'checked', $(this).prop( 'checked' ) );
913 $('.gamipress-all-types-multicheck input[value$="-achievements"]').prop( 'checked', $(this).prop( 'checked' ) );
914 $('.gamipress-all-types-multicheck input[value$="-steps"]').prop( 'checked', $(this).prop( 'checked' ) );
915
916 } else if( checked_option.endsWith( '-achievement-type' ) ) {
917
918 type = checked_option.replace( '-achievement-type', '' );
919 $('.gamipress-all-types-multicheck input[value="' + type + '-achievements"]').prop( 'checked', $(this).prop( 'checked' ) );
920 $('.gamipress-all-types-multicheck input[value="' + type + '-steps"]').prop( 'checked', $(this).prop( 'checked' ) );
921
922 } else if( checked_option.endsWith( '-achievements' ) ) {
923
924 type = checked_option.replace( '-achievements', '' );
925 $('.gamipress-all-types-multicheck input[value="' + type + '-steps"]').prop( 'checked', $(this).prop( 'checked' ) );
926
927 } else if( checked_option === 'all-rank-types' ) {
928
929 $('.gamipress-all-types-multicheck input[value$="-rank-type"]').prop( 'checked', $(this).prop( 'checked' ) );
930 $('.gamipress-all-types-multicheck input[value$="-ranks"]').prop( 'checked', $(this).prop( 'checked' ) );
931 $('.gamipress-all-types-multicheck input[value$="-rank-requirements"]').prop( 'checked', $(this).prop( 'checked' ) );
932
933 } else if( checked_option.endsWith( '-rank-type' ) ) {
934
935 type = checked_option.replace( '-rank-type', '' );
936 $('.gamipress-all-types-multicheck input[value="' + type + '-ranks"]').prop( 'checked', $(this).prop( 'checked' ) );
937 $('.gamipress-all-types-multicheck input[value="' + type + '-rank-requirements"]').prop( 'checked', $(this).prop( 'checked' ) );
938
939 } else if( checked_option.endsWith( '-ranks' ) ) {
940
941 type = checked_option.replace( '-ranks', '' );
942 $('.gamipress-all-types-multicheck input[value="' + type + '-rank-requirements"]').prop( 'checked', $(this).prop( 'checked' ) );
943 }
944
945 });
946
947 $("#export_setup").on('click', function(e) {
948 e.preventDefault();
949
950 $('#export-setup-warning').remove();
951
952 var checked_options = $('.cmb2-id-export-setup-options input:checked');
953
954 if( checked_options.length === 0 ) {
955 $(this).parent().prepend('<p id="export-setup-warning" class="cmb2-metabox-description" style="color: #a00;">You need to choose at least one option to export.</p>');
956 return;
957 }
958
959 $('.export-setup-button').prop('disabled', true);
960
961 if( ! $('#export-setup-response').length )
962 $('.export-setup-button').parent().parent().prepend('<span id="export-setup-response"></span>');
963
964 // Show the spinner
965 $('#export-setup-response').html('<span class="spinner is-active" style="float: none;"></span>');
966
967 var items = [];
968
969 $('.cmb2-id-export-setup-options input:checked').each(function() {
970 items.push($(this).val());
971 });
972
973 $.post(
974 ajaxurl,
975 {
976 action: 'gamipress_export_setup_tool',
977 nonce: gamipress_admin_tools.nonce,
978 items: items
979 },
980 function( response ) {
981
982 if( response.success === false )
983 $('#export-setup-response').css({color:'#a00'});
984 else
985 $('#export-setup-response').css({color:''});
986
987 $('#export-setup-response').html( ( response.data.message !== undefined ? response.data.message : response.data ) );
988
989 if( response.success === true ) {
990 gamipress_download_file( response.data.setup, 'setup-export', 'txt', 'text/plain' );
991 }
992
993 $('.export-setup-button').prop('disabled', false);
994 }
995 );
996
997 });
998
999 // ----------------------------------
1000 // Import Setup Tool
1001 // ----------------------------------
1002
1003 $('#import_setup').on('click', function(e) {
1004 e.preventDefault();
1005
1006 $('#import-setup-warning').remove();
1007
1008 if( $('#import_setup_file')[0].files[0] === undefined ) {
1009 $(this).parent().prepend('<p id="import-setup-warning" class="cmb2-metabox-description" style="color: #a00;">You need to choose a configuration file to import.</p>');
1010 return false;
1011 }
1012
1013 var $this = $(this);
1014 var form_data = new FormData();
1015 form_data.append( 'action', 'gamipress_import_setup_tool' );
1016 form_data.append( 'nonce', gamipress_admin_tools.nonce );
1017 form_data.append( 'file', $('#import_setup_file')[0].files[0] );
1018
1019 // Disable the button
1020 $this.prop('disabled', true);
1021
1022 if( ! $('#import-setup-response').length )
1023 $this.parent().append('<span id="import-setup-response"></span>');
1024
1025 // Show the spinner
1026 $('#import-setup-response').html('<span class="spinner is-active" style="float: none;"></span>');
1027
1028 $.ajax({
1029 url: ajaxurl,
1030 method: 'post',
1031 cache: false,
1032 contentType: false,
1033 processData: false,
1034 data: form_data,
1035 success: function(response) {
1036
1037 if( response.success === false )
1038 $('#import-setup-response').css({color:'#a00'});
1039 else
1040 $('#import-setup-response').css({color:''});
1041
1042 $('#import-setup-response').html(response.data);
1043
1044 $this.prop('disabled', false);
1045
1046 }
1047 });
1048 });
1049
1050 // ----------------------------------
1051 // Import Settings Tool
1052 // ----------------------------------
1053
1054 $('#import_settings').on('click', function(e) {
1055 e.preventDefault();
1056
1057 $('#import-settings-warning').remove();
1058
1059 if( $('#import_settings_file')[0].files[0] === undefined ) {
1060 $(this).parent().prepend('<p id="import-settings-warning" class="cmb2-metabox-description" style="color: #a00;">You need to choose a configuration file to import.</p>');
1061 return false;
1062 }
1063
1064 var $this = $(this);
1065 var form_data = new FormData();
1066 form_data.append( 'action', 'gamipress_import_settings_tool' );
1067 form_data.append( 'nonce', gamipress_admin_tools.nonce );
1068 form_data.append( 'file', $('#import_settings_file')[0].files[0] );
1069
1070 // Disable the button
1071 $this.prop('disabled', true);
1072
1073 if( ! $('#import-settings-response').length )
1074 $this.parent().append('<span id="import-settings-response"></span>');
1075
1076 // Show the spinner
1077 $('#import-settings-response').html('<span class="spinner is-active" style="float: none;"></span>');
1078
1079 $.ajax({
1080 url: ajaxurl,
1081 method: 'post',
1082 cache: false,
1083 contentType: false,
1084 processData: false,
1085 data: form_data,
1086 success: function(response) {
1087
1088 if( response.success === false )
1089 $('#import-settings-response').css({color:'#a00'});
1090 else
1091 $('#import-settings-response').css({color:''});
1092
1093 $('#import-settings-response').html(response.data);
1094
1095 $this.prop('disabled', false);
1096
1097 }
1098 });
1099
1100 });
1101
1102 })( jQuery );