Quiz And Survey Master (Formerly Quiz Master Next) - Version 6.0.0

Version Description

(June 20, 2018) = * Closed Enhancement: Remove Tools tab (Issue #689) * Closed Enhancement: Bump Minimum PHP Version To 5.4 (Issue #607) * Closed Enhancement: Move Leaderboards to free addon (Issue #380)

(Read Full Changelog)

=

Download this release

Release Info

Developer fpcorso
Plugin Icon 128x128 Quiz And Survey Master (Formerly Quiz Master Next)
Version 6.0.0
Comparing to
See all releases

Code changes from version 5.3.2 to 6.0.0

CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  = 5.2.4 (May 7, 2018) =
2
  * Closed Bug: %QUESTIONS_ANSWERS% variable is displaying questions in order of creation - ([Issue #660](https://github.com/fpcorso/quiz_master_next/issues/660))
3
  * Closed Bug: Extra spacing is being added to questions when multiple lines are in question - ([Issue #659](https://github.com/fpcorso/quiz_master_next/issues/659))
1
+ = 5.3.2 (June 7, 2018) =
2
+ * Closed Plugin Compatibility: Conflict with Divi Builder ([Issue #686](https://github.com/fpcorso/quiz_master_next/issues/686))
3
+
4
+ = 5.3.1 (May 21, 2018) =
5
+ * Closed Enhancement: Add user ID to admin results page table - ([Issue #682](https://github.com/fpcorso/quiz_master_next/issues/682))
6
+ * Closed Enhancement: Integrate with WordPress 4.9.6 GDPR features - ([Issue #681](https://github.com/fpcorso/quiz_master_next/issues/681))
7
+
8
+ = 5.3.0 (May 16, 2018) =
9
+ * Closed Enhancement: Ability to disable IP address collection - ([Issue #670](https://github.com/fpcorso/quiz_master_next/issues/670))
10
+ * Closed User Request: Ability to customize name of QSM archive name - ([Issue #666](https://github.com/fpcorso/quiz_master_next/issues/666))
11
+ * Closed User Request: Progress Bar - ([Issue #412](https://github.com/fpcorso/quiz_master_next/issues/412))
12
+ * Closed User Request: Disable Results Being Stored In Database - ([Issue #215](https://github.com/fpcorso/quiz_master_next/issues/215))
13
+ * Closed Bug: Question ordering doesn't work when using older pagination option - ([Issue #657](https://github.com/fpcorso/quiz_master_next/issues/657))
14
+
15
  = 5.2.4 (May 7, 2018) =
16
  * Closed Bug: %QUESTIONS_ANSWERS% variable is displaying questions in order of creation - ([Issue #660](https://github.com/fpcorso/quiz_master_next/issues/660))
17
  * Closed Bug: Extra spacing is being added to questions when multiple lines are in question - ([Issue #659](https://github.com/fpcorso/quiz_master_next/issues/659))
css/qsm-admin.css CHANGED
@@ -61,10 +61,6 @@ Quizzes/Surveys Page
61
  color: red !important;
62
  }
63
 
64
- .qsm-dialog-form {
65
-
66
- }
67
-
68
  .qsm-dialog-form label {
69
  display: inline-block;
70
  font-size: 16px;
@@ -257,3 +253,152 @@ Misc.
257
  .qsm-info-box a {
258
  color: yellow;
259
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
  color: red !important;
62
  }
63
 
 
 
 
 
64
  .qsm-dialog-form label {
65
  display: inline-block;
66
  font-size: 16px;
253
  .qsm-info-box a {
254
  color: yellow;
255
  }
256
+
257
+ .qsm-popup {
258
+ font-family: -apple-system,BlinkMacSystemFont,avenir next,avenir,helvetica neue,helvetica,ubuntu,roboto,noto,segoe ui,arial,sans-serif;
259
+ }
260
+
261
+ .qsm-popup__overlay {
262
+ position: fixed;
263
+ top: 0;
264
+ left: 0;
265
+ right: 0;
266
+ bottom: 0;
267
+ background: rgba(0,0,0,0.6);
268
+ display: flex;
269
+ justify-content: center;
270
+ align-items: center;
271
+ z-index: 9999;
272
+ }
273
+
274
+ .qsm-popup__container {
275
+ background-color: #fff;
276
+ padding: 30px;
277
+ min-width: 500px;
278
+ max-width: 700px;
279
+ max-height: 95vh;
280
+ border-radius: 4px;
281
+ overflow-y: auto;
282
+ box-sizing: border-box;
283
+ }
284
+
285
+ .qsm-popup__header {
286
+ display: flex;
287
+ justify-content: space-between;
288
+ align-items: center;
289
+ }
290
+
291
+ .qsm-popup__title {
292
+ margin-top: 0;
293
+ margin-bottom: 0;
294
+ font-weight: 600;
295
+ font-size: 1.25rem;
296
+ line-height: 1.25;
297
+ color: #00449e;
298
+ box-sizing: border-box;
299
+ }
300
+
301
+ .qsm-popup__close {
302
+ background: transparent;
303
+ border: 0;
304
+ color: #00449e;
305
+ text-decoration: none;
306
+ }
307
+
308
+ .qsm-popup__header .qsm-popup__close:before {
309
+ content: "\2715";
310
+ }
311
+
312
+ .qsm-popup__content {
313
+ margin-top: 2rem;
314
+ margin-bottom: 2rem;
315
+ line-height: 1.5;
316
+ color: rgba(0,0,0,.8);
317
+ }
318
+
319
+ .qsm-popup__btn {
320
+ font-size: .875rem;
321
+ padding-left: 1rem;
322
+ padding-right: 1rem;
323
+ padding-top: .5rem;
324
+ padding-bottom: .5rem;
325
+ background-color: #e6e6e6;
326
+ color: rgba(0,0,0,.8);
327
+ border-radius: .25rem;
328
+ border-style: none;
329
+ border-width: 0;
330
+ cursor: pointer;
331
+ -webkit-appearance: button;
332
+ text-transform: none;
333
+ overflow: visible;
334
+ line-height: 1.15;
335
+ margin: 0;
336
+ will-change: transform;
337
+ -moz-osx-font-smoothing: grayscale;
338
+ -webkit-backface-visibility: hidden;
339
+ backface-visibility: hidden;
340
+ -webkit-transform: translateZ(0);
341
+ transform: translateZ(0);
342
+ transition: -webkit-transform .25s ease-out;
343
+ transition: transform .25s ease-out;
344
+ transition: transform .25s ease-out,-webkit-transform .25s ease-out;
345
+ }
346
+
347
+ .qsm-popup__btn:focus, .qsm-popup__btn:hover {
348
+ -webkit-transform: scale(1.05);
349
+ transform: scale(1.05);
350
+ }
351
+
352
+ .qsm-popup__btn-primary {
353
+ background-color: #00449e;
354
+ color: #fff;
355
+ }
356
+
357
+ @keyframes mmfadeIn {
358
+ from { opacity: 0; }
359
+ to { opacity: 1; }
360
+ }
361
+
362
+ @keyframes mmfadeOut {
363
+ from { opacity: 1; }
364
+ to { opacity: 0; }
365
+ }
366
+
367
+ @keyframes mmslideIn {
368
+ from { transform: translateY(15%); }
369
+ to { transform: translateY(0); }
370
+ }
371
+
372
+ @keyframes mmslideOut {
373
+ from { transform: translateY(0); }
374
+ to { transform: translateY(-10%); }
375
+ }
376
+
377
+ .qsm-popup-slide {
378
+ display: none;
379
+ }
380
+
381
+ .qsm-popup-slide.is-open {
382
+ display: block;
383
+ }
384
+
385
+ .qsm-popup-slide[aria-hidden="false"] .qsm-popup__overlay {
386
+ animation: mmfadeIn .3s cubic-bezier(0.0, 0.0, 0.2, 1);
387
+ }
388
+
389
+ .qsm-popup-slide[aria-hidden="false"] .qsm-popup__container {
390
+ animation: mmslideIn .3s cubic-bezier(0, 0, .2, 1);
391
+ }
392
+
393
+ .qsm-popup-slide[aria-hidden="true"] .qsm-popup__overlay {
394
+ animation: mmfadeOut .3s cubic-bezier(0.0, 0.0, 0.2, 1);
395
+ }
396
+
397
+ .qsm-popup-slide[aria-hidden="true"] .qsm-popup__container {
398
+ animation: mmslideOut .3s cubic-bezier(0, 0, .2, 1);
399
+ }
400
+
401
+ .qsm-popup-slide .qsm-popup__container,
402
+ .qsm-popup-slide .qsm-popup__overlay {
403
+ will-change: transform;
404
+ }
js/qsm-admin.js CHANGED
@@ -47,7 +47,7 @@ var QSMQuizzesSurveys;
47
  $( '#delete_quiz_name' ).val( val.name );
48
  }
49
  });
50
- $( '#delete_dialog' ).dialog( 'open' );
51
  },
52
  editQuizName: function( quiz_id ) {
53
  $( '#edit_quiz_id' ).val( quiz_id );
@@ -56,49 +56,27 @@ var QSMQuizzesSurveys;
56
  $( '#edit_quiz_name' ).val( val.name );
57
  }
58
  });
59
- $( '#edit_dialog' ).dialog( 'open' );
60
  },
61
  duplicateQuiz: function( quiz_id ) {
62
  $( '#duplicate_quiz_id' ).val( quiz_id );
63
- $( '#duplicate_dialog' ).dialog( 'open' );
64
- }
 
 
 
 
 
 
 
 
 
 
65
  };
66
  $(function() {
67
- $( '#new_quiz_dialog' ).dialog({
68
- autoOpen: false,
69
- buttons: {
70
- Cancel: function() {
71
- $( this ).dialog( 'close' );
72
- }
73
- }
74
- });
75
- $( '#delete_dialog' ).dialog({
76
- autoOpen: false,
77
- buttons: {
78
- Cancel: function() {
79
- $( this ).dialog( 'close' );
80
- }
81
- }
82
- });
83
- $( '#edit_dialog' ).dialog({
84
- autoOpen: false,
85
- buttons: {
86
- Cancel: function() {
87
- $( this ).dialog( 'close' );
88
- }
89
- }
90
- });
91
- $( '#duplicate_dialog' ).dialog({
92
- autoOpen: false,
93
- buttons: {
94
- Cancel: function() {
95
- $( this ).dialog( 'close' );
96
- }
97
- }
98
- });
99
  $( '#new_quiz_button, #new_quiz_button_two' ).on( 'click', function( event ) {
100
  event.preventDefault();
101
- $( '#new_quiz_dialog' ).dialog( 'open' );
102
  });
103
  $( '#quiz_search' ).keyup( function() {
104
  QSMQuizzesSurveys.searchQuizzes( $( this ).val() );
@@ -115,6 +93,30 @@ var QSMQuizzesSurveys;
115
  event.preventDefault();
116
  QSMQuizzesSurveys.editQuizName( $( this ).parents( '.qsm-quiz-row' ).data( 'id' ) );
117
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
118
  QSMQuizzesSurveys.load();
119
  });
120
  }(jQuery));
47
  $( '#delete_quiz_name' ).val( val.name );
48
  }
49
  });
50
+ MicroModal.show( 'modal-5' );
51
  },
52
  editQuizName: function( quiz_id ) {
53
  $( '#edit_quiz_id' ).val( quiz_id );
56
  $( '#edit_quiz_name' ).val( val.name );
57
  }
58
  });
59
+ MicroModal.show( 'modal-3' );
60
  },
61
  duplicateQuiz: function( quiz_id ) {
62
  $( '#duplicate_quiz_id' ).val( quiz_id );
63
+ MicroModal.show( 'modal-4' );
64
+ },
65
+ /**
66
+ * Opens the popup to reset quiz stats
67
+ *
68
+ * @param int The ID of the quiz
69
+ */
70
+ openResetPopup: function( quiz_id ) {
71
+ quiz_id = parseInt( quiz_id );
72
+ $( '#reset_quiz_id' ).val( quiz_id );
73
+ MicroModal.show( 'modal-1' );
74
+ },
75
  };
76
  $(function() {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
  $( '#new_quiz_button, #new_quiz_button_two' ).on( 'click', function( event ) {
78
  event.preventDefault();
79
+ MicroModal.show( 'modal-2' );
80
  });
81
  $( '#quiz_search' ).keyup( function() {
82
  QSMQuizzesSurveys.searchQuizzes( $( this ).val() );
93
  event.preventDefault();
94
  QSMQuizzesSurveys.editQuizName( $( this ).parents( '.qsm-quiz-row' ).data( 'id' ) );
95
  });
96
+ $( '#the-list' ).on( 'click', '.qsm-action-link-reset', function( event ) {
97
+ event.preventDefault();
98
+ QSMQuizzesSurveys.openResetPopup( $( this ).parents( '.qsm-quiz-row' ).data( 'id' ) );
99
+ });
100
+ $( '#reset-stats-button' ).on( 'click', function( event ) {
101
+ event.preventDefault();
102
+ $( '#reset_quiz_form' ).submit();
103
+ });
104
+ $( '#create-quiz-button' ).on( 'click', function( event ) {
105
+ event.preventDefault();
106
+ $( '#new-quiz-form' ).submit();
107
+ });
108
+ $( '#edit-name-button' ).on( 'click', function( event ) {
109
+ event.preventDefault();
110
+ $( '#edit-name-form' ).submit();
111
+ });
112
+ $( '#duplicate-quiz-button' ).on( 'click', function( event ) {
113
+ event.preventDefault();
114
+ $( '#duplicate-quiz-form' ).submit();
115
+ });
116
+ $( '#delete-quiz-button' ).on( 'click', function( event ) {
117
+ event.preventDefault();
118
+ $( '#delete-quiz-form' ).submit();
119
+ });
120
  QSMQuizzesSurveys.load();
121
  });
122
  }(jQuery));
mlw_quizmaster2.php CHANGED
@@ -2,14 +2,14 @@
2
  /**
3
  * Plugin Name: Quiz And Survey Master
4
  * Description: Easily and quickly add quizzes and surveys to your website.
5
- * Version: 5.3.2
6
  * Author: Frank Corso
7
  * Author URI: https://www.quizandsurveymaster.com/
8
  * Plugin URI: https://www.quizandsurveymaster.com/
9
  * Text Domain: quiz-master-next
10
  *
11
  * @author Frank Corso
12
- * @version 5.3.2
13
  * @package QSM
14
  */
15
 
@@ -33,7 +33,7 @@ class MLWQuizMasterNext {
33
  * @var string
34
  * @since 4.0.0
35
  */
36
- public $version = '5.3.2';
37
 
38
  /**
39
  * QSM Alert Manager Object
@@ -130,11 +130,9 @@ class MLWQuizMasterNext {
130
  include 'php/admin/options-page-contact-tab.php';
131
  include 'php/admin/options-page-text-tab.php';
132
  include 'php/admin/options-page-option-tab.php';
133
- include 'php/admin/options-page-leaderboard-tab.php';
134
  include 'php/admin/options-page-email-tab.php';
135
  include 'php/admin/options-page-results-page-tab.php';
136
  include 'php/admin/options-page-style-tab.php';
137
- include 'php/admin/options-page-tools-tab.php';
138
  include 'php/admin/options-page-preview-tab.php';
139
  include 'php/admin/addons-page.php';
140
  include 'php/admin/settings-page.php';
@@ -146,8 +144,6 @@ class MLWQuizMasterNext {
146
  include 'php/classes/class-qsm-contact-manager.php';
147
  include 'php/classes/class-qmn-quiz-manager.php';
148
 
149
- include 'php/leaderboard-shortcode.php';
150
- include 'php/widgets.php';
151
  include 'php/template-variables.php';
152
  include 'php/adverts-generate.php';
153
  include 'php/question-types.php';
@@ -180,8 +176,6 @@ class MLWQuizMasterNext {
180
  private function add_hooks() {
181
  add_action( 'admin_menu', array( $this, 'setup_admin_menu' ) );
182
  add_action( 'admin_head', array( $this, 'admin_head' ), 900 );
183
- add_action( 'widgets_init', create_function( '', 'return register_widget("Mlw_Qmn_Leaderboard_Widget");' ) );
184
- add_shortcode( 'mlw_quizmaster_leaderboard', 'mlw_quiz_leaderboard_shortcode' );
185
  add_action( 'init', array( $this, 'register_quiz_post_types' ) );
186
  }
187
 
2
  /**
3
  * Plugin Name: Quiz And Survey Master
4
  * Description: Easily and quickly add quizzes and surveys to your website.
5
+ * Version: 6.0.0
6
  * Author: Frank Corso
7
  * Author URI: https://www.quizandsurveymaster.com/
8
  * Plugin URI: https://www.quizandsurveymaster.com/
9
  * Text Domain: quiz-master-next
10
  *
11
  * @author Frank Corso
12
+ * @version 6.0.0
13
  * @package QSM
14
  */
15
 
33
  * @var string
34
  * @since 4.0.0
35
  */
36
+ public $version = '6.0.0';
37
 
38
  /**
39
  * QSM Alert Manager Object
130
  include 'php/admin/options-page-contact-tab.php';
131
  include 'php/admin/options-page-text-tab.php';
132
  include 'php/admin/options-page-option-tab.php';
 
133
  include 'php/admin/options-page-email-tab.php';
134
  include 'php/admin/options-page-results-page-tab.php';
135
  include 'php/admin/options-page-style-tab.php';
 
136
  include 'php/admin/options-page-preview-tab.php';
137
  include 'php/admin/addons-page.php';
138
  include 'php/admin/settings-page.php';
144
  include 'php/classes/class-qsm-contact-manager.php';
145
  include 'php/classes/class-qmn-quiz-manager.php';
146
 
 
 
147
  include 'php/template-variables.php';
148
  include 'php/adverts-generate.php';
149
  include 'php/question-types.php';
176
  private function add_hooks() {
177
  add_action( 'admin_menu', array( $this, 'setup_admin_menu' ) );
178
  add_action( 'admin_head', array( $this, 'admin_head' ), 900 );
 
 
179
  add_action( 'init', array( $this, 'register_quiz_post_types' ) );
180
  }
181
 
php/admin/about-page.php CHANGED
@@ -33,27 +33,20 @@ function mlw_generate_about_page() {
33
  </h2>
34
  <div class="qsm-tab-content tab-1">
35
  <div class="feature">
36
- <h2 class="feature-headline">Welcome to QSM 5.3!</h2>
37
  </div>
38
  <div class="feature">
39
- <h2 class="feature-headline">New Progress Bar!</h2>
40
- <p class="feature-text">You can now enable a progress bar on quizzes and surveys that are using the new pages and questions editor from the 5.2.0 update!</p>
41
- <p class="feature-text">When editing your quiz or survey, go to the "Options" tab and set the "Show a progress bar?" option to "Yes".</p>
42
  </div>
43
  <div class="feature">
44
- <h2 class="feature-headline">Disable IP Address Collection</h2>
45
- <p class="feature-text">You can now disable the plugin from collecting IP addresses, if needed. To do so, go to the "Settings" page and check the "Disable collecting and storing IP addresses?" checkbox.</p>
46
- </div>
47
- <div class="feature">
48
- <h2 class="feature-headline">Disable Storing Results In The Database</h2>
49
- <p class="feature-text">For the quizzes and surveys that do not need to actually store any responses, you can now turn off the results being stored in the database. To do so, go to the "Options" tab when editing your quiz or survey and set the "Store the responses in the database?" option to "No".</p>
50
  </div>
51
  </div>
52
  <div class="qsm-tab-content tab-2" style="display: none;">
53
  <h2>Changelog</h2>
54
- <?php QSM_Changelog_Generator::get_changelog_list( 'fpcorso/quiz_master_next', 52 ); ?>
55
- <?php QSM_Changelog_Generator::get_changelog_list( 'fpcorso/quiz_master_next', 51 ); ?>
56
- <?php QSM_Changelog_Generator::get_changelog_list( 'fpcorso/quiz_master_next', 50 ); ?>
57
  </div>
58
  <div class="qsm-tab-content tab-3" style="display:none;">
59
  <h2>GitHub Contributors</h2>
33
  </h2>
34
  <div class="qsm-tab-content tab-1">
35
  <div class="feature">
36
+ <h2 class="feature-headline">Welcome to QSM 6.0!</h2>
37
  </div>
38
  <div class="feature">
39
+ <h2 class="feature-headline">New PHP Minimum</h2>
40
+ <p class="feature-text">As planned, all versions of Quiz And Survey Master starting with this version will require a minimum of PHP 5.4.</p>
 
41
  </div>
42
  <div class="feature">
43
+ <h2 class="feature-headline">Removing Of Deprecated Features</h2>
44
+ <p class="feature-text">As planned, the Leaderboards is now in our free addon instead of being built into the main plugin. The old "Tools" tab has also been removed.</p>
 
 
 
 
45
  </div>
46
  </div>
47
  <div class="qsm-tab-content tab-2" style="display: none;">
48
  <h2>Changelog</h2>
49
+ <?php QSM_Changelog_Generator::get_changelog_list( 'fpcorso/quiz_master_next', 36 ); ?>
 
 
50
  </div>
51
  <div class="qsm-tab-content tab-3" style="display:none;">
52
  <h2>GitHub Contributors</h2>
php/admin/options-page-leaderboard-tab.php DELETED
@@ -1,64 +0,0 @@
1
- <?php
2
- if ( ! defined( 'ABSPATH' ) ) exit;
3
-
4
- /**
5
- * Adds the leaderboard to the Quiz Settings page.
6
- *
7
- * @return void
8
- * @since 4.4.0
9
- */
10
- function qmn_settings_leaderboard_tab() {
11
- global $mlwQuizMasterNext;
12
- $mlwQuizMasterNext->pluginHelper->register_quiz_settings_tabs( __( "Leaderboard", 'quiz-master-next' ), 'qsm_options_leaderboard_tab_content' );
13
- }
14
- add_action( "plugins_loaded", 'qmn_settings_leaderboard_tab', 5 );
15
-
16
-
17
- /**
18
- * Adds the leaderboard content to the leaderboard tab.
19
- *
20
- * @return void
21
- * @since 4.4.0
22
- */
23
- function qsm_options_leaderboard_tab_content() {
24
- global $wpdb;
25
- global $mlwQuizMasterNext;
26
- ?>
27
- <div style="background:#fff;border-left: 4px solid #fff;padding: 1px 12px;margin: 5px 0 15px;border-left-color: #dc3232;">
28
- <p style="font-weight:bold;">Warning: This feature is being removed from the core version. Please use our new free Leaderboards addon. You can read more about this change in <a href="http://bit.ly/2sPOKxw" target="_blank">our post about the leaderboards being moved.</a></p>
29
- </div>
30
- <h3><?php _e( 'Template Variables', 'quiz-master-next' ); ?></h3>
31
- <table class="form-table">
32
- <tr>
33
- <td><strong>%FIRST_PLACE_NAME%</strong> - <?php _e("The name of the user who is in first place", 'quiz-master-next'); ?></td>
34
- <td><strong>%FIRST_PLACE_SCORE%</strong> - <?php _e("The score from the first place's quiz", 'quiz-master-next'); ?></td>
35
- </tr>
36
-
37
- <tr>
38
- <td><strong>%SECOND_PLACE_NAME%</strong> - <?php _e("The name of the user who is in second place", 'quiz-master-next'); ?></td>
39
- <td><strong>%SECOND_PLACE_SCORE%</strong> - <?php _e("The score from the second place's quiz", 'quiz-master-next'); ?></td>
40
- </tr>
41
-
42
- <tr>
43
- <td><strong>%THIRD_PLACE_NAME%</strong> - <?php _e('The name of the user who is in third place', 'quiz-master-next'); ?></td>
44
- <td><strong>%THIRD_PLACE_SCORE%</strong> - <?php _e("The score from the third place's quiz", 'quiz-master-next'); ?></td>
45
- </tr>
46
-
47
- <tr>
48
- <td><strong>%FOURTH_PLACE_NAME%</strong> - <?php _e('The name of the user who is in fourth place', 'quiz-master-next'); ?></td>
49
- <td><strong>%FOURTH_PLACE_SCORE%</strong> - <?php _e("The score from the fourth place's quiz", 'quiz-master-next'); ?></td>
50
- </tr>
51
-
52
- <tr>
53
- <td><strong>%FIFTH_PLACE_NAME%</strong> - <?php _e('The name of the user who is in fifth place', 'quiz-master-next'); ?></td>
54
- <td><strong>%FIFTH_PLACE_SCORE%</strong> - <?php _e("The score from the fifth place's quiz", 'quiz-master-next'); ?></td>
55
- </tr>
56
-
57
- <tr>
58
- <td><strong>%QUIZ_NAME%</strong> - <?php _e("The name of the quiz", 'quiz-master-next'); ?></td>
59
- </tr>
60
- </table>
61
- <?php
62
- $mlwQuizMasterNext->pluginHelper->generate_settings_section( 'quiz_leaderboards' );
63
- }
64
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
php/admin/options-page-tools-tab.php DELETED
@@ -1,113 +0,0 @@
1
- <?php
2
- if ( ! defined( 'ABSPATH' ) ) exit;
3
-
4
- /**
5
- * Adds the Tools tab to the Quiz Settings page.
6
- *
7
- * @return void
8
- * @since 4.4.0
9
- */
10
- function qmn_settings_tools_tab()
11
- {
12
- global $mlwQuizMasterNext;
13
- $mlwQuizMasterNext->pluginHelper->register_quiz_settings_tabs(__("Tools", 'quiz-master-next'), 'mlw_options_tools_tab_content');
14
- }
15
- add_action("plugins_loaded", 'qmn_settings_tools_tab', 5);
16
-
17
- /**
18
- * Adds the Tools tab content to the Tools tab.
19
- *
20
- * @return void
21
- * @since 4.4.0
22
- */
23
- function mlw_options_tools_tab_content()
24
- {
25
- global $wpdb;
26
- global $mlwQuizMasterNext;
27
- $quiz_id = intval($_GET["quiz_id"]);
28
- //Update Quiz Table
29
- if (isset($_POST["mlw_reset_quiz_stats"]) && $_POST["mlw_reset_quiz_stats"] == "confirmation")
30
- {
31
- //Variables from reset stats form
32
- $mlw_reset_stats_quiz_id = intval( $_POST["mlw_reset_quiz_id"] );
33
- $results = $wpdb->update(
34
- $wpdb->prefix . "mlw_quizzes",
35
- array(
36
- 'quiz_views' => 0,
37
- 'quiz_taken' => 0,
38
- 'last_activity' => date("Y-m-d H:i:s")
39
- ),
40
- array( 'quiz_id' => $mlw_reset_stats_quiz_id ),
41
- array(
42
- '%d',
43
- '%d',
44
- '%s'
45
- ),
46
- array( '%d' )
47
- );
48
- if ( $results ) {
49
- $mlwQuizMasterNext->alertManager->newAlert(__('The stats has been reset successfully.', 'quiz-master-next'), 'success');
50
- $mlwQuizMasterNext->audit_manager->new_audit( "Quiz Stats Have Been Reset For Quiz Number $mlw_reset_stats_quiz_id" );
51
- } else {
52
- $mlwQuizMasterNext->alertManager->newAlert(sprintf(__('There has been an error in this action. Please share this with the developer. Error Code: %s', 'quiz-master-next'), '0010'), 'error');
53
- $mlwQuizMasterNext->log_manager->add("Error 0010", $wpdb->last_error.' from '.$wpdb->last_query, 0, 'error');
54
- }
55
- }
56
-
57
- if ( isset( $_GET["quiz_id"] ) ) {
58
- $table_name = $wpdb->prefix . "mlw_quizzes";
59
- $mlw_quiz_options = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $table_name WHERE quiz_id=%d LIMIT 1", $quiz_id ) );
60
- }
61
- ?>
62
- <div id="tabs-8" class="mlw_tab_content">
63
- <script type="text/javascript">
64
- var $j = jQuery.noConflict();
65
- // increase the default animation speed to exaggerate the effect
66
- $j.fx.speeds._default = 1000;
67
- $j(function() {
68
- $j( "#tabs" ).tabs();
69
- });
70
- </script>
71
- <script>
72
- jQuery(function() {
73
- jQuery('#mlw_reset_stats_dialog').dialog({
74
- autoOpen: false,
75
- show: 'blind',
76
- width:700,
77
- hide: 'explode',
78
- buttons: {
79
- Ok: function() {
80
- jQuery(this).dialog('close');
81
- }
82
- }
83
- });
84
-
85
- jQuery('#mlw_reset_stats_button').click(function() {
86
- jQuery('#mlw_reset_stats_dialog').dialog('open');
87
- return false;
88
- } );
89
- });
90
- </script>
91
- <p><?php _e('Use this button to reset all the stats collected for this quiz (Quiz Views and Times Quiz Has Been Taken).', 'quiz-master-next'); ?></p>
92
- <button class="button" id="mlw_reset_stats_button"><?php _e('Reset Quiz Views And Taken Stats', 'quiz-master-next'); ?></button>
93
- <hr />
94
- <h3>Addon Quiz Settings</h3>
95
- <div id="tabs">
96
- <ul>
97
- <?php do_action('mlw_qmn_options_tab'); ?>
98
- </ul>
99
- <?php do_action('mlw_qmn_options_tab_content'); ?>
100
- </div>
101
- <?php do_action('mlw_qmn_quiz_tools'); ?>
102
- <div id="mlw_reset_stats_dialog" title="Reset Stats For This Quiz" style="display:none;">
103
- <p><?php _e('Are you sure you want to reset the stats to 0? All views and taken stats for this quiz will be reset. This is permanent and cannot be undone.', 'quiz-master-next'); ?></p>
104
- <form action='' method='post'>
105
- <input type='hidden' name='mlw_reset_quiz_stats' value='confirmation' />
106
- <input type='hidden' name='mlw_reset_quiz_id' value='<?php echo $quiz_id; ?>' />
107
- <p class='submit'><input type='submit' class='button-primary' value='<?php _e('Reset All Stats For Quiz', 'quiz-master-next'); ?>' /></p>
108
- </form>
109
- </div>
110
- </div>
111
- <?php
112
- }
113
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
php/admin/quizzes-page.php CHANGED
@@ -24,9 +24,9 @@ function qsm_generate_quizzes_surveys_page() {
24
  global $mlwQuizMasterNext;
25
 
26
  // Enqueue our styles and scripts.
 
27
  wp_enqueue_style( 'qsm_admin_style', plugins_url( '../../css/qsm-admin.css', __FILE__ ), array(), $mlwQuizMasterNext->version );
28
- wp_enqueue_script( 'qsm_admin_script', plugins_url( '../../js/qsm-admin.js', __FILE__ ), array( 'wp-util', 'underscore', 'jquery-ui-core', 'jquery-ui-dialog', 'jquery-ui-button' ), $mlwQuizMasterNext->version );
29
- wp_enqueue_style( 'qsm_jquery_redmond_theme', '//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/themes/redmond/jquery-ui.css' );
30
 
31
  // Create new quiz.
32
  if ( isset( $_POST['qsm_new_quiz_nonce'] ) && wp_verify_nonce( $_POST['qsm_new_quiz_nonce'], 'qsm_new_quiz' ) ) {
@@ -55,6 +55,33 @@ function qsm_generate_quizzes_surveys_page() {
55
  $mlwQuizMasterNext->quizCreator->duplicate_quiz( $quiz_id, $quiz_name, isset( $_POST['duplicate_questions'] ) );
56
  }
57
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  // Load our quizzes.
59
  $quizzes = $mlwQuizMasterNext->pluginHelper->get_quizzes();
60
 
@@ -205,48 +232,123 @@ function qsm_generate_quizzes_surveys_page() {
205
  ?>
206
  </div>
207
 
208
- <!--New Quiz Dialog-->
209
- <div id="new_quiz_dialog" title="<?php _e( 'Create New Quiz Or Survey', 'quiz-master-next' ); ?>" style="display:none;">
210
- <form action="" method="post" class="qsm-dialog-form">
211
- <?php wp_nonce_field( 'qsm_new_quiz', 'qsm_new_quiz_nonce' ); ?>
212
- <h3><?php _e( 'Create New Quiz Or Survey', 'quiz-master-next' ); ?></h3>
213
- <label><?php _e( 'Name', 'quiz-master-next' ); ?></label><input type="text" name="quiz_name" value="" />
214
- <p class='submit'><input type='submit' class='button-primary' value='<?php _e( 'Create', 'quiz-master-next' ); ?>' /></p>
215
- </form>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
216
  </div>
217
 
218
- <!--Edit Quiz Name Dialog-->
219
- <div id="edit_dialog" title="<?php _e( 'Edit Name', 'quiz-master-next' ); ?>" style="display:none;">
220
- <form action='' method='post' class="qsm-dialog-form">
221
- <label><?php _e( 'Name', 'quiz-master-next' ); ?></label>
222
- <input type="text" id="edit_quiz_name" name="edit_quiz_name" />
223
- <input type="hidden" id="edit_quiz_id" name="edit_quiz_id" />
224
- <?php wp_nonce_field( 'qsm_edit_name_quiz', 'qsm_edit_name_quiz_nonce' ); ?>
225
- <p class='submit'><input type='submit' class='button-primary' value='<?php _e( 'Edit', 'quiz-master-next' ); ?>' /></p>
226
- </form>
 
 
 
 
 
 
 
 
 
 
 
 
 
227
  </div>
228
 
229
- <!--Duplicate Quiz Dialog-->
230
- <div id="duplicate_dialog" title="<?php _e( 'Duplicate', 'quiz-master-next' ); ?>" style="display:none;">
231
- <form action='' method='post' class="qsm-dialog-form">
232
- <label for="duplicate_questions"><?php _e( 'Duplicate questions also?', 'quiz-master-next' ); ?></label><input type="checkbox" name="duplicate_questions" id="duplicate_questions"/><br />
233
- <br />
234
- <label for="duplicate_new_quiz_name"><?php _e( 'Name Of New Quiz Or Survey:', 'quiz-master-next' ); ?></label><input type="text" id="duplicate_new_quiz_name" name="duplicate_new_quiz_name" />
235
- <input type="hidden" id="duplicate_quiz_id" name="duplicate_quiz_id" />
236
- <?php wp_nonce_field( 'qsm_duplicate_quiz', 'qsm_duplicate_quiz_nonce' ); ?>
237
- <p class='submit'><input type='submit' class='button-primary' value='<?php _e( 'Duplicate', 'quiz-master-next' ); ?>' /></p>
238
- </form>
 
 
 
 
 
 
 
 
 
 
 
 
 
239
  </div>
240
 
241
- <!--Delete Quiz Dialog-->
242
- <div id="delete_dialog" title="<?php _e( 'Delete', 'quiz-master-next' ); ?>" style="display:none;">
243
- <form action='' method='post' class="qsm-dialog-form">
244
- <h3><b><?php _e( 'Are you sure you want to delete this quiz or survey?', 'quiz-master-next' ); ?></b></h3>
245
- <?php wp_nonce_field( 'qsm_delete_quiz', 'qsm_delete_quiz_nonce' ); ?>
246
- <input type='hidden' id='delete_quiz_id' name='delete_quiz_id' value='' />
247
- <input type='hidden' id='delete_quiz_name' name='delete_quiz_name' value='' />
248
- <p class='submit'><input type='submit' class='button-primary' value='<?php _e( 'Delete', 'quiz-master-next' ); ?>' /></p>
249
- </form>
 
 
 
 
 
 
 
 
 
 
 
 
 
250
  </div>
251
 
252
  <!-- Templates -->
@@ -275,7 +377,12 @@ function qsm_generate_quizzes_surveys_page() {
275
  </td>
276
  <td>[qsm quiz={{ data.id }}]</td>
277
  <td>[qsm_link id={{ data.id }}]<?php _e( 'Click here', 'quiz-master-next' ); ?>[/qsm_link]</td>
278
- <td>{{ data.views }}/{{ data.taken }}</td>
 
 
 
 
 
279
  <td>{{ data.lastActivity }}</td>
280
  </tr>
281
  </script>
24
  global $mlwQuizMasterNext;
25
 
26
  // Enqueue our styles and scripts.
27
+ wp_enqueue_script( 'micromodal_script', plugins_url( '../../js/micromodal.min.js', __FILE__ ) );
28
  wp_enqueue_style( 'qsm_admin_style', plugins_url( '../../css/qsm-admin.css', __FILE__ ), array(), $mlwQuizMasterNext->version );
29
+ wp_enqueue_script( 'qsm_admin_script', plugins_url( '../../js/qsm-admin.js', __FILE__ ), array( 'wp-util', 'underscore', 'jquery', 'micromodal_script' ), $mlwQuizMasterNext->version );
 
30
 
31
  // Create new quiz.
32
  if ( isset( $_POST['qsm_new_quiz_nonce'] ) && wp_verify_nonce( $_POST['qsm_new_quiz_nonce'], 'qsm_new_quiz' ) ) {
55
  $mlwQuizMasterNext->quizCreator->duplicate_quiz( $quiz_id, $quiz_name, isset( $_POST['duplicate_questions'] ) );
56
  }
57
 
58
+ // Resets stats for a quiz.
59
+ if ( isset( $_POST['qsm_reset_stats_nonce'] ) && wp_verify_nonce( $_POST['qsm_reset_stats_nonce'] , 'qsm_reset_stats' ) ) {
60
+ $quiz_id = intval( $_POST['reset_quiz_id'] );
61
+ $results = $wpdb->update(
62
+ $wpdb->prefix . 'mlw_quizzes',
63
+ array(
64
+ 'quiz_views' => 0,
65
+ 'quiz_taken' => 0,
66
+ 'last_activity' => date( 'Y-m-d H:i:s' ),
67
+ ),
68
+ array( 'quiz_id' => $quiz_id ),
69
+ array(
70
+ '%d',
71
+ '%d',
72
+ '%s',
73
+ ),
74
+ array( '%d' )
75
+ );
76
+ if ( false !== $results ) {
77
+ $mlwQuizMasterNext->alertManager->newAlert( __( 'The stats has been reset successfully.', 'quiz-master-next' ), 'success' );
78
+ $mlwQuizMasterNext->audit_manager->new_audit( "Quiz Stats Have Been Reset For Quiz Number $quiz_id" );
79
+ } else {
80
+ $mlwQuizMasterNext->alertManager->newAlert( __( 'Error trying to reset stats. Please try again.', 'quiz-master-next' ), 'error' );
81
+ $mlwQuizMasterNext->log_manager->add( 'Error resetting stats', $wpdb->last_error . ' from ' . $wpdb->last_query, 0, 'error' );
82
+ }
83
+ }
84
+
85
  // Load our quizzes.
86
  $quizzes = $mlwQuizMasterNext->pluginHelper->get_quizzes();
87
 
232
  ?>
233
  </div>
234
 
235
+ <!-- Popup for resetting stats -->
236
+ <div class="qsm-popup qsm-popup-slide" id="modal-1" aria-hidden="true">
237
+ <div class="qsm-popup__overlay" tabindex="-1" data-micromodal-close>
238
+ <div class="qsm-popup__container" role="dialog" aria-modal="true" aria-labelledby="modal-1-title">
239
+ <header class="qsm-popup__header">
240
+ <h2 class="qsm-popup__title" id="modal-1-title">Reset stats for this quiz?</h2>
241
+ <a class="qsm-popup__close" aria-label="Close modal" data-micromodal-close></a>
242
+ </header>
243
+ <main class="qsm-popup__content" id="modal-1-content">
244
+ <p><?php _e('Are you sure you want to reset the stats to 0? All views and taken stats for this quiz will be reset. This is permanent and cannot be undone.', 'quiz-master-next'); ?></p>
245
+ <form action="" method="post" id="reset_quiz_form">
246
+ <?php wp_nonce_field( 'qsm_reset_stats', 'qsm_reset_stats_nonce' ); ?>
247
+ <input type="hidden" id="reset_quiz_id" name="reset_quiz_id" value="0" />
248
+ </form>
249
+ </main>
250
+ <footer class="qsm-popup__footer">
251
+ <button id="reset-stats-button" class="qsm-popup__btn qsm-popup__btn-primary"><?php _e('Reset All Stats For Quiz', 'quiz-master-next'); ?></button>
252
+ <button class="qsm-popup__btn" data-micromodal-close aria-label="Close this dialog window"><?php _e('Cancel', 'quiz-master-next'); ?></button>
253
+ </footer>
254
+ </div>
255
+ </div>
256
+ </div>
257
+
258
+ <!-- Popup for new quiz -->
259
+ <div class="qsm-popup qsm-popup-slide" id="modal-2" aria-hidden="true">
260
+ <div class="qsm-popup__overlay" tabindex="-1" data-micromodal-close>
261
+ <div class="qsm-popup__container" role="dialog" aria-modal="true" aria-labelledby="modal-2-title">
262
+ <header class="qsm-popup__header">
263
+ <h2 class="qsm-popup__title" id="modal-2-title"><?php _e( 'Create New Quiz Or Survey', 'quiz-master-next' ); ?></h2>
264
+ <a class="qsm-popup__close" aria-label="Close modal" data-micromodal-close></a>
265
+ </header>
266
+ <main class="qsm-popup__content" id="modal-2-content">
267
+ <form action="" method="post" id="new-quiz-form">
268
+ <?php wp_nonce_field( 'qsm_new_quiz', 'qsm_new_quiz_nonce' ); ?>
269
+ <label><?php _e( 'Name', 'quiz-master-next' ); ?></label>
270
+ <input type="text" name="quiz_name" value="" />
271
+ </form>
272
+ </main>
273
+ <footer class="qsm-popup__footer">
274
+ <button id="create-quiz-button" class="qsm-popup__btn qsm-popup__btn-primary"><?php _e('Create', 'quiz-master-next'); ?></button>
275
+ <button class="qsm-popup__btn" data-micromodal-close aria-label="Close this dialog window"><?php _e('Cancel', 'quiz-master-next'); ?></button>
276
+ </footer>
277
+ </div>
278
+ </div>
279
  </div>
280
 
281
+ <!-- Popup for edit quiz name -->
282
+ <div class="qsm-popup qsm-popup-slide" id="modal-3" aria-hidden="true">
283
+ <div class="qsm-popup__overlay" tabindex="-1" data-micromodal-close>
284
+ <div class="qsm-popup__container" role="dialog" aria-modal="true" aria-labelledby="modal-3-title">
285
+ <header class="qsm-popup__header">
286
+ <h2 class="qsm-popup__title" id="modal-3-title"><?php _e( 'Edit Name', 'quiz-master-next' ); ?></h2>
287
+ <a class="qsm-popup__close" aria-label="Close modal" data-micromodal-close></a>
288
+ </header>
289
+ <main class="qsm-popup__content" id="modal-3-content">
290
+ <form action='' method='post' id="edit-name-form">
291
+ <label><?php _e( 'Name', 'quiz-master-next' ); ?></label>
292
+ <input type="text" id="edit_quiz_name" name="edit_quiz_name" />
293
+ <input type="hidden" id="edit_quiz_id" name="edit_quiz_id" />
294
+ <?php wp_nonce_field( 'qsm_edit_name_quiz', 'qsm_edit_name_quiz_nonce' ); ?>
295
+ </form>
296
+ </main>
297
+ <footer class="qsm-popup__footer">
298
+ <button id="edit-name-button" class="qsm-popup__btn qsm-popup__btn-primary"><?php _e('Edit', 'quiz-master-next'); ?></button>
299
+ <button class="qsm-popup__btn" data-micromodal-close aria-label="Close this dialog window"><?php _e('Cancel', 'quiz-master-next'); ?></button>
300
+ </footer>
301
+ </div>
302
+ </div>
303
  </div>
304
 
305
+ <!-- Popup for duplicate quiz -->
306
+ <div class="qsm-popup qsm-popup-slide" id="modal-4" aria-hidden="true">
307
+ <div class="qsm-popup__overlay" tabindex="-1" data-micromodal-close>
308
+ <div class="qsm-popup__container" role="dialog" aria-modal="true" aria-labelledby="modal-4-title">
309
+ <header class="qsm-popup__header">
310
+ <h2 class="qsm-popup__title" id="modal-4-title"><?php _e( 'Duplicate', 'quiz-master-next' ); ?></h2>
311
+ <a class="qsm-popup__close" aria-label="Close modal" data-micromodal-close></a>
312
+ </header>
313
+ <main class="qsm-popup__content" id="modal-4-content">
314
+ <form action='' method='post' id="duplicate-quiz-form">
315
+ <label for="duplicate_questions"><?php _e( 'Duplicate questions also?', 'quiz-master-next' ); ?></label><input type="checkbox" name="duplicate_questions" id="duplicate_questions"/><br />
316
+ <br />
317
+ <label for="duplicate_new_quiz_name"><?php _e( 'Name Of New Quiz Or Survey:', 'quiz-master-next' ); ?></label><input type="text" id="duplicate_new_quiz_name" name="duplicate_new_quiz_name" />
318
+ <input type="hidden" id="duplicate_quiz_id" name="duplicate_quiz_id" />
319
+ <?php wp_nonce_field( 'qsm_duplicate_quiz', 'qsm_duplicate_quiz_nonce' ); ?>
320
+ </form>
321
+ </main>
322
+ <footer class="qsm-popup__footer">
323
+ <button id="duplicate-quiz-button" class="qsm-popup__btn qsm-popup__btn-primary"><?php _e('Duplicate', 'quiz-master-next'); ?></button>
324
+ <button class="qsm-popup__btn" data-micromodal-close aria-label="Close this dialog window"><?php _e('Cancel', 'quiz-master-next'); ?></button>
325
+ </footer>
326
+ </div>
327
+ </div>
328
  </div>
329
 
330
+ <!-- Popup for delete quiz -->
331
+ <div class="qsm-popup qsm-popup-slide" id="modal-5" aria-hidden="true">
332
+ <div class="qsm-popup__overlay" tabindex="-1" data-micromodal-close>
333
+ <div class="qsm-popup__container" role="dialog" aria-modal="true" aria-labelledby="modal-5-title">
334
+ <header class="qsm-popup__header">
335
+ <h2 class="qsm-popup__title" id="modal-5-title"><?php _e( 'Delete', 'quiz-master-next' ); ?></h2>
336
+ <a class="qsm-popup__close" aria-label="Close modal" data-micromodal-close></a>
337
+ </header>
338
+ <main class="qsm-popup__content" id="modal-5-content">
339
+ <form action='' method='post' id="delete-quiz-form">
340
+ <h3><b><?php _e( 'Are you sure you want to delete this quiz or survey?', 'quiz-master-next' ); ?></b></h3>
341
+ <?php wp_nonce_field( 'qsm_delete_quiz', 'qsm_delete_quiz_nonce' ); ?>
342
+ <input type='hidden' id='delete_quiz_id' name='delete_quiz_id' value='' />
343
+ <input type='hidden' id='delete_quiz_name' name='delete_quiz_name' value='' />
344
+ </form>
345
+ </main>
346
+ <footer class="qsm-popup__footer">
347
+ <button id="delete-quiz-button" class="qsm-popup__btn qsm-popup__btn-primary"><?php _e('Delete', 'quiz-master-next'); ?></button>
348
+ <button class="qsm-popup__btn" data-micromodal-close aria-label="Close this dialog window"><?php _e('Cancel', 'quiz-master-next'); ?></button>
349
+ </footer>
350
+ </div>
351
+ </div>
352
  </div>
353
 
354
  <!-- Templates -->
377
  </td>
378
  <td>[qsm quiz={{ data.id }}]</td>
379
  <td>[qsm_link id={{ data.id }}]<?php _e( 'Click here', 'quiz-master-next' ); ?>[/qsm_link]</td>
380
+ <td>
381
+ {{ data.views }}/{{ data.taken }}
382
+ <div class="row-actions">
383
+ <a class="qsm-action-link qsm-action-link-reset" href="#"><?php _e( 'Reset', 'quiz-master-next' ); ?></a>
384
+ </div>
385
+ </td>
386
  <td>{{ data.lastActivity }}</td>
387
  </tr>
388
  </script>
php/classes/class-qsm-install.php CHANGED
@@ -717,28 +717,6 @@ class QSM_Install {
717
  'default' => 'The entered text is not correct!'
718
  );
719
  $mlwQuizMasterNext->pluginHelper->register_quiz_setting( $field_array, 'quiz_text' );
720
-
721
- // Registers template setting
722
- $field_array = array(
723
- 'id' => 'template',
724
- 'label' => __('Leaderboard Template', 'quiz-master-next'),
725
- 'type' => 'editor',
726
- 'variables' => array(
727
- '%QUIZ_NAME%',
728
- '%FIRST_PLACE_NAME%',
729
- '%FIRST_PLACE_SCORE%',
730
- '%SECOND_PLACE_NAME%',
731
- '%SECOND_PLACE_SCORE%',
732
- '%THIRD_PLACE_NAME%',
733
- '%THIRD_PLACE_SCORE%',
734
- '%FOURTH_PLACE_NAME%',
735
- '%FOURTH_PLACE_SCORE%',
736
- '%FIFTH_PLACE_NAME%',
737
- '%FIFTH_PLACE_SCORE%'
738
- ),
739
- 'default' => 0
740
- );
741
- $mlwQuizMasterNext->pluginHelper->register_quiz_setting( $field_array, 'quiz_leaderboards' );
742
  }
743
 
744
  /**
@@ -927,21 +905,6 @@ class QSM_Install {
927
  $results = $wpdb->query( $update_sql );
928
  }
929
 
930
- //Update 0.9.2
931
- if($wpdb->get_var("SHOW COLUMNS FROM ".$table_name." LIKE 'leaderboard_template'") != "leaderboard_template")
932
- {
933
- $sql = "ALTER TABLE ".$table_name." ADD leaderboard_template TEXT NOT NULL AFTER comment_field_text";
934
- $results = $wpdb->query( $sql );
935
- $mlw_leaderboard_default = "<h3>Leaderboard for %QUIZ_NAME%</h3>
936
- 1. %FIRST_PLACE_NAME%-%FIRST_PLACE_SCORE%<br />
937
- 2. %SECOND_PLACE_NAME%-%SECOND_PLACE_SCORE%<br />
938
- 3. %THIRD_PLACE_NAME%-%THIRD_PLACE_SCORE%<br />
939
- 4. %FOURTH_PLACE_NAME%-%FOURTH_PLACE_SCORE%<br />
940
- 5. %FIFTH_PLACE_NAME%-%FIFTH_PLACE_SCORE%<br />";
941
- $update_sql = "UPDATE ".$table_name." SET leaderboard_template='".$mlw_leaderboard_default."'";
942
- $results = $wpdb->query( $update_sql );
943
- }
944
-
945
  //Update 0.9.4
946
  if($wpdb->get_var("SHOW COLUMNS FROM ".$table_name." LIKE 'randomness_order'") != "randomness_order")
947
  {
717
  'default' => 'The entered text is not correct!'
718
  );
719
  $mlwQuizMasterNext->pluginHelper->register_quiz_setting( $field_array, 'quiz_text' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
720
  }
721
 
722
  /**
905
  $results = $wpdb->query( $update_sql );
906
  }
907
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
908
  //Update 0.9.4
909
  if($wpdb->get_var("SHOW COLUMNS FROM ".$table_name." LIKE 'randomness_order'") != "randomness_order")
910
  {
php/leaderboard-shortcode.php DELETED
@@ -1,82 +0,0 @@
1
- <?php
2
- if ( ! defined( 'ABSPATH' ) ) exit;
3
-
4
- /**
5
- * This function creates the leaderboard that is displayed.
6
- *
7
- * Sorts the scores a quizzes by type.
8
- *
9
- * @param $atts This is wordpress return for shortcodes
10
- * @return type $mlw_quiz_leaderboard_display This variable contains all the contents of the leaderboard.
11
- * @since 4.4.0
12
- */
13
- function mlw_quiz_leaderboard_shortcode( $atts ) {
14
-
15
- extract(shortcode_atts(array(
16
- 'mlw_quiz' => 0
17
- ), $atts));
18
- $mlw_quiz_id = intval( $mlw_quiz );
19
- $mlw_quiz_leaderboard_display = "";
20
-
21
-
22
- global $wpdb;
23
- $mlw_quiz_options = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM " . $wpdb->prefix . "mlw_quizzes" . " WHERE quiz_id=%d AND deleted='0'", $mlw_quiz_id ) );
24
- foreach($mlw_quiz_options as $mlw_eaches) {
25
- $mlw_quiz_options = $mlw_eaches;
26
- break;
27
- }
28
- $sql = "SELECT * FROM " . $wpdb->prefix . "mlw_results WHERE quiz_id=%d AND deleted='0'";
29
- if ($mlw_quiz_options->system == 0)
30
- {
31
- $sql .= " ORDER BY correct_score DESC";
32
- }
33
- if ($mlw_quiz_options->system == 1)
34
- {
35
- $sql .= " ORDER BY point_score DESC";
36
- }
37
- $sql .= " LIMIT 10";
38
- $mlw_result_data = $wpdb->get_results( $wpdb->prepare( $sql, $mlw_quiz_id ) );
39
-
40
- $mlw_quiz_leaderboard_display = $mlw_quiz_options->leaderboard_template;
41
- $mlw_quiz_leaderboard_display = str_replace( "%QUIZ_NAME%" , $mlw_quiz_options->quiz_name, $mlw_quiz_leaderboard_display);
42
-
43
- $leader_count = 0;
44
- foreach($mlw_result_data as $mlw_eaches) {
45
- $leader_count++;
46
- if ($leader_count == 1) {$mlw_quiz_leaderboard_display = str_replace( "%FIRST_PLACE_NAME%" , $mlw_eaches->name, $mlw_quiz_leaderboard_display);}
47
- if ($leader_count == 2) {$mlw_quiz_leaderboard_display = str_replace( "%SECOND_PLACE_NAME%" , $mlw_eaches->name, $mlw_quiz_leaderboard_display);}
48
- if ($leader_count == 3) {$mlw_quiz_leaderboard_display = str_replace( "%THIRD_PLACE_NAME%" , $mlw_eaches->name, $mlw_quiz_leaderboard_display);}
49
- if ($leader_count == 4) {$mlw_quiz_leaderboard_display = str_replace( "%FOURTH_PLACE_NAME%" , $mlw_eaches->name, $mlw_quiz_leaderboard_display);}
50
- if ($leader_count == 5) {$mlw_quiz_leaderboard_display = str_replace( "%FIFTH_PLACE_NAME%" , $mlw_eaches->name, $mlw_quiz_leaderboard_display);}
51
- if ($mlw_quiz_options->system == 0)
52
- {
53
- if ($leader_count == 1) {$mlw_quiz_leaderboard_display = str_replace( "%FIRST_PLACE_SCORE%" , $mlw_eaches->correct_score."%", $mlw_quiz_leaderboard_display);}
54
- if ($leader_count == 2) {$mlw_quiz_leaderboard_display = str_replace( "%SECOND_PLACE_SCORE%" , $mlw_eaches->correct_score."%", $mlw_quiz_leaderboard_display);}
55
- if ($leader_count == 3) {$mlw_quiz_leaderboard_display = str_replace( "%THIRD_PLACE_SCORE%" , $mlw_eaches->correct_score."%", $mlw_quiz_leaderboard_display);}
56
- if ($leader_count == 4) {$mlw_quiz_leaderboard_display = str_replace( "%FOURTH_PLACE_SCORE%" , $mlw_eaches->correct_score."%", $mlw_quiz_leaderboard_display);}
57
- if ($leader_count == 5) {$mlw_quiz_leaderboard_display = str_replace( "%FIFTH_PLACE_SCORE%" , $mlw_eaches->correct_score."%", $mlw_quiz_leaderboard_display);}
58
- }
59
- if ($mlw_quiz_options->system == 1)
60
- {
61
- if ($leader_count == 1) {$mlw_quiz_leaderboard_display = str_replace( "%FIRST_PLACE_SCORE%" , $mlw_eaches->point_score." Points", $mlw_quiz_leaderboard_display);}
62
- if ($leader_count == 2) {$mlw_quiz_leaderboard_display = str_replace( "%SECOND_PLACE_SCORE%" , $mlw_eaches->point_score." Points", $mlw_quiz_leaderboard_display);}
63
- if ($leader_count == 3) {$mlw_quiz_leaderboard_display = str_replace( "%THIRD_PLACE_SCORE%" , $mlw_eaches->point_score." Points", $mlw_quiz_leaderboard_display);}
64
- if ($leader_count == 4) {$mlw_quiz_leaderboard_display = str_replace( "%FOURTH_PLACE_SCORE%" , $mlw_eaches->point_score." Points", $mlw_quiz_leaderboard_display);}
65
- if ($leader_count == 5) {$mlw_quiz_leaderboard_display = str_replace( "%FIFTH_PLACE_SCORE%" , $mlw_eaches->point_score." Points", $mlw_quiz_leaderboard_display);}
66
- }
67
- }
68
- $mlw_quiz_leaderboard_display = str_replace( "%QUIZ_NAME%" , " ", $mlw_quiz_leaderboard_display);
69
- $mlw_quiz_leaderboard_display = str_replace( "%FIRST_PLACE_NAME%" , " ", $mlw_quiz_leaderboard_display);
70
- $mlw_quiz_leaderboard_display = str_replace( "%SECOND_PLACE_NAME%" , " ", $mlw_quiz_leaderboard_display);
71
- $mlw_quiz_leaderboard_display = str_replace( "%THIRD_PLACE_NAME%" , " ", $mlw_quiz_leaderboard_display);
72
- $mlw_quiz_leaderboard_display = str_replace( "%FOURTH_PLACE_NAME%" , " ", $mlw_quiz_leaderboard_display);
73
- $mlw_quiz_leaderboard_display = str_replace( "%FIFTH_PLACE_NAME%" , " ", $mlw_quiz_leaderboard_display);
74
- $mlw_quiz_leaderboard_display = str_replace( "%FIRST_PLACE_SCORE%" , " ", $mlw_quiz_leaderboard_display);
75
- $mlw_quiz_leaderboard_display = str_replace( "%SECOND_PLACE_SCORE%" , " ", $mlw_quiz_leaderboard_display);
76
- $mlw_quiz_leaderboard_display = str_replace( "%THIRD_PLACE_SCORE%" , " ", $mlw_quiz_leaderboard_display);
77
- $mlw_quiz_leaderboard_display = str_replace( "%FOURTH_PLACE_SCORE%" , " ", $mlw_quiz_leaderboard_display);
78
- $mlw_quiz_leaderboard_display = str_replace( "%FIFTH_PLACE_SCORE%" , " ", $mlw_quiz_leaderboard_display);
79
-
80
- return $mlw_quiz_leaderboard_display;
81
- }
82
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
php/widgets.php DELETED
@@ -1,128 +0,0 @@
1
- <?php
2
- if ( ! defined( 'ABSPATH' ) ) exit;
3
-
4
- /**
5
- * The class contains all of the functions for the leaderboard widget.
6
- *
7
- * @return void
8
- * @since 4.4.0
9
- */
10
- class Mlw_Qmn_Leaderboard_Widget extends WP_Widget {
11
-
12
- // constructor
13
- function __construct() {
14
- parent::__construct(false, $name = __('Quiz And Survey Master Leaderboard Widget', 'quiz-master-next'));
15
- }
16
-
17
- // widget form creation
18
- function form($instance) {
19
- // Check values
20
- if( $instance) {
21
- $title = esc_attr($instance['title']);
22
- $quiz_id = esc_attr($instance['quiz_id']);
23
- } else {
24
- $title = '';
25
- $quiz_id = '';
26
- }
27
- ?>
28
- <p>
29
- <label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Widget Title', 'quiz-master-next'); ?></label>
30
- <input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo $title; ?>" />
31
- </p>
32
- <p>
33
- <label for="<?php echo $this->get_field_id('quiz_id'); ?>"><?php _e('Quiz ID', 'quiz-master-next'); ?></label>
34
- <input class="widefat" id="<?php echo $this->get_field_id('quiz_id'); ?>" name="<?php echo $this->get_field_name('quiz_id'); ?>" type="number" step="1" min="1" value="<?php echo $quiz_id; ?>" />
35
- </p>
36
- <?php
37
- }
38
-
39
- // widget update
40
- function update($new_instance, $old_instance) {
41
- $instance = $old_instance;
42
- // Fields
43
- $instance['title'] = strip_tags($new_instance['title']);
44
- $instance['quiz_id'] = strip_tags($new_instance['quiz_id']);
45
- return $instance;
46
- }
47
-
48
- // widget display
49
- function widget($args, $instance) {
50
- extract( $args );
51
- // Filter to alter leadboard widget title
52
- $title = apply_filters('qsm_leaderboard_widget_title', $instance['title']);
53
- $quiz_id = $instance['quiz_id'];
54
- echo $before_widget;
55
- // Display the widget
56
- echo '<div class="widget-text wp_widget_plugin_box">';
57
- // Check if title is set
58
- if ( $title ) {
59
- echo $before_title . $title . $after_title;
60
- }
61
- $mlw_quiz_id = intval( $quiz_id );
62
- $mlw_quiz_leaderboard_display = "";
63
-
64
-
65
- global $wpdb;
66
- $mlw_quiz_options = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM " . $wpdb->prefix . "mlw_quizzes WHERE quiz_id=%d AND deleted='0'", $mlw_quiz_id ) );
67
- foreach($mlw_quiz_options as $mlw_eaches) {
68
- $mlw_quiz_options = $mlw_eaches;
69
- break;
70
- }
71
- $sql = "SELECT * FROM " . $wpdb->prefix . "mlw_results WHERE quiz_id=%d AND deleted='0'";
72
- if ($mlw_quiz_options->system == 0)
73
- {
74
- $sql .= " ORDER BY correct_score DESC";
75
- }
76
- if ($mlw_quiz_options->system == 1)
77
- {
78
- $sql .= " ORDER BY point_score DESC";
79
- }
80
- $sql .= " LIMIT 10";
81
- $mlw_result_data = $wpdb->get_results( $wpdb->prepare( $sql, $mlw_quiz_id ) );
82
-
83
- $mlw_quiz_leaderboard_display = $mlw_quiz_options->leaderboard_template;
84
- $mlw_quiz_leaderboard_display = str_replace( "%QUIZ_NAME%" , $mlw_quiz_options->quiz_name, $mlw_quiz_leaderboard_display);
85
-
86
- $leader_count = 0;
87
- foreach($mlw_result_data as $mlw_eaches) {
88
- $leader_count++;
89
- if ($leader_count == 1) {$mlw_quiz_leaderboard_display = str_replace( "%FIRST_PLACE_NAME%" , $mlw_eaches->name, $mlw_quiz_leaderboard_display);}
90
- if ($leader_count == 2) {$mlw_quiz_leaderboard_display = str_replace( "%SECOND_PLACE_NAME%" , $mlw_eaches->name, $mlw_quiz_leaderboard_display);}
91
- if ($leader_count == 3) {$mlw_quiz_leaderboard_display = str_replace( "%THIRD_PLACE_NAME%" , $mlw_eaches->name, $mlw_quiz_leaderboard_display);}
92
- if ($leader_count == 4) {$mlw_quiz_leaderboard_display = str_replace( "%FOURTH_PLACE_NAME%" , $mlw_eaches->name, $mlw_quiz_leaderboard_display);}
93
- if ($leader_count == 5) {$mlw_quiz_leaderboard_display = str_replace( "%FIFTH_PLACE_NAME%" , $mlw_eaches->name, $mlw_quiz_leaderboard_display);}
94
- if ($mlw_quiz_options->system == 0)
95
- {
96
- if ($leader_count == 1) {$mlw_quiz_leaderboard_display = str_replace( "%FIRST_PLACE_SCORE%" , $mlw_eaches->correct_score."%", $mlw_quiz_leaderboard_display);}
97
- if ($leader_count == 2) {$mlw_quiz_leaderboard_display = str_replace( "%SECOND_PLACE_SCORE%" , $mlw_eaches->correct_score."%", $mlw_quiz_leaderboard_display);}
98
- if ($leader_count == 3) {$mlw_quiz_leaderboard_display = str_replace( "%THIRD_PLACE_SCORE%" , $mlw_eaches->correct_score."%", $mlw_quiz_leaderboard_display);}
99
- if ($leader_count == 4) {$mlw_quiz_leaderboard_display = str_replace( "%FOURTH_PLACE_SCORE%" , $mlw_eaches->correct_score."%", $mlw_quiz_leaderboard_display);}
100
- if ($leader_count == 5) {$mlw_quiz_leaderboard_display = str_replace( "%FIFTH_PLACE_SCORE%" , $mlw_eaches->correct_score."%", $mlw_quiz_leaderboard_display);}
101
- }
102
- if ($mlw_quiz_options->system == 1)
103
- {
104
- if ($leader_count == 1) {$mlw_quiz_leaderboard_display = str_replace( "%FIRST_PLACE_SCORE%" , $mlw_eaches->point_score." Points", $mlw_quiz_leaderboard_display);}
105
- if ($leader_count == 2) {$mlw_quiz_leaderboard_display = str_replace( "%SECOND_PLACE_SCORE%" , $mlw_eaches->point_score." Points", $mlw_quiz_leaderboard_display);}
106
- if ($leader_count == 3) {$mlw_quiz_leaderboard_display = str_replace( "%THIRD_PLACE_SCORE%" , $mlw_eaches->point_score." Points", $mlw_quiz_leaderboard_display);}
107
- if ($leader_count == 4) {$mlw_quiz_leaderboard_display = str_replace( "%FOURTH_PLACE_SCORE%" , $mlw_eaches->point_score." Points", $mlw_quiz_leaderboard_display);}
108
- if ($leader_count == 5) {$mlw_quiz_leaderboard_display = str_replace( "%FIFTH_PLACE_SCORE%" , $mlw_eaches->point_score." Points", $mlw_quiz_leaderboard_display);}
109
- }
110
- }
111
- $mlw_quiz_leaderboard_display = str_replace( "%QUIZ_NAME%" , " ", $mlw_quiz_leaderboard_display);
112
- $mlw_quiz_leaderboard_display = str_replace( "%FIRST_PLACE_NAME%" , " ", $mlw_quiz_leaderboard_display);
113
- $mlw_quiz_leaderboard_display = str_replace( "%SECOND_PLACE_NAME%" , " ", $mlw_quiz_leaderboard_display);
114
- $mlw_quiz_leaderboard_display = str_replace( "%THIRD_PLACE_NAME%" , " ", $mlw_quiz_leaderboard_display);
115
- $mlw_quiz_leaderboard_display = str_replace( "%FOURTH_PLACE_NAME%" , " ", $mlw_quiz_leaderboard_display);
116
- $mlw_quiz_leaderboard_display = str_replace( "%FIFTH_PLACE_NAME%" , " ", $mlw_quiz_leaderboard_display);
117
- $mlw_quiz_leaderboard_display = str_replace( "%FIRST_PLACE_SCORE%" , " ", $mlw_quiz_leaderboard_display);
118
- $mlw_quiz_leaderboard_display = str_replace( "%SECOND_PLACE_SCORE%" , " ", $mlw_quiz_leaderboard_display);
119
- $mlw_quiz_leaderboard_display = str_replace( "%THIRD_PLACE_SCORE%" , " ", $mlw_quiz_leaderboard_display);
120
- $mlw_quiz_leaderboard_display = str_replace( "%FOURTH_PLACE_SCORE%" , " ", $mlw_quiz_leaderboard_display);
121
- $mlw_quiz_leaderboard_display = str_replace( "%FIFTH_PLACE_SCORE%" , " ", $mlw_quiz_leaderboard_display);
122
-
123
- echo $mlw_quiz_leaderboard_display;
124
- echo '</div>';
125
- echo $after_widget;
126
- }
127
- }
128
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
readme.txt CHANGED
@@ -3,8 +3,8 @@ Contributors: fpcorso
3
  Tags: quiz, survey, lead, test, score, exam, questionnaire, question
4
  Requires at least: 4.8
5
  Tested up to: 4.9
6
- Requires PHP: 5.2
7
- Stable tag: 5.3.2
8
  License: GPLv2
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -111,19 +111,10 @@ This is usually a theme conflict. You can [checkout out our common conflict solu
111
 
112
  == Changelog ==
113
 
114
- = 5.3.2 (June 7, 2018) =
115
- * Closed Plugin Compatibility: Conflict with Divi Builder ([Issue #686](https://api.github.com/repos/fpcorso/quiz_master_next/issues/686))
116
-
117
- = 5.3.1 (May 21, 2018) =
118
- * Closed Enhancement: Add user ID to admin results page table - ([Issue #682](https://github.com/fpcorso/quiz_master_next/issues/682))
119
- * Closed Enhancement: Integrate with WordPress 4.9.6 GDPR features - ([Issue #681](https://github.com/fpcorso/quiz_master_next/issues/681))
120
-
121
- = 5.3.0 (May 16, 2018) =
122
- * Closed Enhancement: Ability to disable IP address collection - ([Issue #670](https://github.com/fpcorso/quiz_master_next/issues/670))
123
- * Closed User Request: Ability to customize name of QSM archive name - ([Issue #666](https://github.com/fpcorso/quiz_master_next/issues/666))
124
- * Closed User Request: Progress Bar - ([Issue #412](https://github.com/fpcorso/quiz_master_next/issues/412))
125
- * Closed User Request: Disable Results Being Stored In Database - ([Issue #215](https://github.com/fpcorso/quiz_master_next/issues/215))
126
- * Closed Bug: Question ordering doesn't work when using older pagination option - ([Issue #657](https://github.com/fpcorso/quiz_master_next/issues/657))
127
 
128
  ([Read Full Changelog](https://github.com/fpcorso/quiz_master_next/blob/master/CHANGELOG.md))
129
 
3
  Tags: quiz, survey, lead, test, score, exam, questionnaire, question
4
  Requires at least: 4.8
5
  Tested up to: 4.9
6
+ Requires PHP: 5.4
7
+ Stable tag: 6.0.0
8
  License: GPLv2
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
111
 
112
  == Changelog ==
113
 
114
+ = 6.0.0 (June 20, 2018) =
115
+ * Closed Enhancement: Remove Tools tab ([Issue #689](https://github.com/fpcorso/quiz_master_next/issues/689))
116
+ * Closed Enhancement: Bump Minimum PHP Version To 5.4 ([Issue #607](https://github.com/fpcorso/quiz_master_next/issues/607))
117
+ * Closed Enhancement: Move Leaderboards to free addon ([Issue #380](https://github.com/fpcorso/quiz_master_next/issues/380))
 
 
 
 
 
 
 
 
 
118
 
119
  ([Read Full Changelog](https://github.com/fpcorso/quiz_master_next/blob/master/CHANGELOG.md))
120