Changeset 1925352
- Timestamp:
- 08/15/2018 05:01:49 PM (8 years ago)
- Location:
- point-tracker
- Files:
-
- 7 added
- 19 edited
- 11 copied
-
assets/screenshot-1.png (added)
-
assets/screenshot-2.png (added)
-
assets/screenshot-3.png (added)
-
assets/screenshot-4.PNG (added)
-
assets/screenshot-5.png (added)
-
assets/screenshot-6.png (added)
-
assets/screenshot-7.png (added)
-
tags/1.1 (copied) (copied from point-tracker/trunk)
-
tags/1.1/LICENSE (copied) (copied from point-tracker/trunk/LICENSE)
-
tags/1.1/README.md (copied) (copied from point-tracker/trunk/README.md)
-
tags/1.1/README.txt (copied) (copied from point-tracker/trunk/README.txt) (6 diffs)
-
tags/1.1/admin (copied) (copied from point-tracker/trunk/admin)
-
tags/1.1/admin/js/point-tracker-admin.min.js (modified) (1 diff)
-
tags/1.1/includes (copied) (copied from point-tracker/trunk/includes)
-
tags/1.1/includes/ajax/activity-ajax.php (modified) (1 diff)
-
tags/1.1/includes/ajax/participant-ajax.php (modified) (4 diffs)
-
tags/1.1/includes/class-point-tracker.php (modified) (1 diff)
-
tags/1.1/index.php (copied) (copied from point-tracker/trunk/index.php)
-
tags/1.1/languages (copied) (copied from point-tracker/trunk/languages)
-
tags/1.1/point-tracker.php (copied) (copied from point-tracker/trunk/point-tracker.php)
-
tags/1.1/public (copied) (copied from point-tracker/trunk/public)
-
tags/1.1/public/class-point-tracker-public.php (modified) (1 diff)
-
tags/1.1/public/js/point-tracker-public.min.js (modified) (1 diff)
-
tags/1.1/public/partials/point-tracker-challenge-list-pg.php (modified) (2 diffs)
-
tags/1.1/public/partials/point-tracker-challenge-pg.php (modified) (2 diffs)
-
tags/1.1/public/partials/point-tracker-my-activity-pg.php (modified) (2 diffs)
-
tags/1.1/uninstall.php (copied) (copied from point-tracker/trunk/uninstall.php)
-
trunk/README.txt (modified) (6 diffs)
-
trunk/admin/js/point-tracker-admin.min.js (modified) (1 diff)
-
trunk/includes/ajax/activity-ajax.php (modified) (1 diff)
-
trunk/includes/ajax/participant-ajax.php (modified) (4 diffs)
-
trunk/includes/class-point-tracker.php (modified) (1 diff)
-
trunk/public/class-point-tracker-public.php (modified) (1 diff)
-
trunk/public/js/point-tracker-public.min.js (modified) (1 diff)
-
trunk/public/partials/point-tracker-challenge-list-pg.php (modified) (2 diffs)
-
trunk/public/partials/point-tracker-challenge-pg.php (modified) (2 diffs)
-
trunk/public/partials/point-tracker-my-activity-pg.php (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
point-tracker/tags/1.1/README.txt
r1924930 r1925352 1 1 === Plugin Name === 2 P lugin Name: Point Tracker2 Point Tracker 3 3 Contributors: godsgood33 4 Tags: team activities 4 Tags: team activities, challenge, content 5 5 Requires at least: 4.4.2 6 6 Requires PHP: 5.6 … … 14 14 == Description == 15 15 16 This plugin does not require but works well with membership plugins. The admin can create a challenge, 17 share the challenge link with whom they wish. Those wishing to participate can click on the link and opt to join the challenge. 18 Once the participant has joined the challenge, they can enter activity against that challenge upto daily and receive points. 19 Leader boards are available if the admin opts to have the system make one available. 16 This plugin does not require but works well with membership plugins. The admin can create a challenge, share the challenge link with whom they wish. Those wishing to participate can click on the link and opt to join the challenge. Once the participant has joined the challenge, they can enter activity against that challenge upto daily and receive points. Leader boards are available if the admin opts to have the system make one available. 20 17 21 18 == Installation == … … 26 23 2. Activate the plugin through the 'Plugins' menu in WordPress 27 24 3. The Point Tracker admin menu is used to administer the challenges, its activitie, and participants. 28 4. There is a PT Settings page under the Settings menu to control options for the Point Tracker 25 4. Navigate to the Point Tracker -> Point Tracker admin menu 26 5. Fill out the form and create a challenge (add a name, start and end dates, and a description) then click "Save" 27 6. Copy the link that appears just above the description box 28 7. Navigate to the Point Tracker -> Activities admin menu 29 8. Select the challenge you just created from the drop down 30 9. Fill out the boxes and create your first activity for that challenge and click "Save" 31 10. Send the link to whomever you wish to get them to join 32 11. Under Settings -> PT Settings there are global options that you can enable, right now, it is only requiring an account for those wanting to participate in a challenge 29 33 30 34 == Frequently Asked Questions == … … 40 44 The challenge will automatically approve all pending participants and any future participants will automatically be approved 41 45 46 = Once the challenge is over what happens? = 47 48 You will need to visit the Point Tracker -> Participants page to see who has the most points 49 50 = A participant entered some wrong information, what do I do? = 51 52 You can either delete it yourself or if they visit the View My Activity page (/my-activity/?chal={linkcode}), they will be able to delete it themselves 53 54 = I'd like a leader board = 55 56 One will be available in Point Tracker Pro releasing soon 57 42 58 == Screenshots == 43 59 … … 45 61 2. This is a screenshot of the Challenge editor 46 62 3. This is a screenshot of the Activity editor 47 4. This is a screenshot of the admin Leader Board 48 5. This is a screenshot of the participant log 63 4. This is a screenshot of the Participant list 64 5. This is a screenshot of the Entry log 65 6. This is a screenshot of an example challenge and activities 66 7. This is a screenshot of the "View My Activity" page after a test user has saved some activities 49 67 50 68 == Changelog == … … 53 71 * Initial release 54 72 73 = 1.1 = 74 * Couple bug fixes 75 * Add screenshots 76 * 77 55 78 == Upgrade Notice == 56 79 -
point-tracker/tags/1.1/admin/js/point-tracker-admin.min.js
r1924930 r1925352 8 8 }var t=$("#activity-table").DataTable();if(!$("#act-id").val()){t.row.add({order:$("#act-order").val(),type:$("#act-type option:selected").text(),name:data.name,points:$("#act-pts").val(),chal_max:($("#act-chal-max").val()?$("#act-chal-max").val():0),question:data.question,desc:data.desc,extras:($("#act-type").val()==="checkbox"||$("#act-type").val()==="radio"?data.label:($("#act-min").val()?$("#act-min").val():0)+"/"+($("#act-max").val()?$("#act-max").val():0)),action:"<i class='fas fa-edit' data-id='"+data.id+"'></i> <i class='far fa-trash-alt' data-id='"+data.id+"'></i>"}).draw(false); 9 9 }else{var tmp=t.row($("#t-row").val()).data();tmp.order=$("#act-order").val();tmp.type=$("#act-type option:selected").text();tmp.name=data.name;tmp.points=$("#act-pts").val();tmp.chal_max=($("#act-chal-max").val()?$("#act-chal-max").val():0);tmp.question=data.question;tmp.desc=data.desc;tmp.extras=($("#act-type").val()==="checkbox"||$("#act-type").val()==="radio"?data.label:($("#act-min").val()?$("#act-min").val():0)+"/"+($("#act-max").val()?$("#act-max").val():0));t.row($("#t-row").val()).invalidate(tmp).draw(); 10 $(".fa-edit").click(edit_activity);}reset_activity_form();},error:function(xhr,status,error){console.error(error);},dataType:"json",method:"post"});}function change_act_type(){$("#act-labels,#act-min,#act-max").hide();if($("#act-type").val()=="checkbox"||$("#act-type").val()=="radio"){$("#act-labels").show();}else{if($("#act-type").val()=="text"||$("#act-type").val()=="number"){$("#act-min,#act-max").show();}}}function edit_activity(){$.ajax(ajaxurl,{data:{action:"get-activity-details","act-id":$(this).data("id") },beforeSend:beforeAjaxSend,complete:ajaxComplete,success:function(data){$("#t-row").val(data.order-1);11 $("#act-id").val(data.id);$("#act-type").val(data.type);$("#act-name").val(data.name);$("#act-pts").val(data.points);$("#act-chal-max").val(data.chal_max);$("#act-ques").val(data.question);$("#act-desc").val(data.desc);$("#act-order").val(data.order);$("#act-labels").val(data.label);$("#act-min").val(data.min);$("#act-max").val(data.max);change_act_type();},error:function(xhr,status,error){console.error(error);},dataType:"json",method:"post"});}function validate_activity(){var ret=true;$("#msg span").remove();12 $("#msg ").removeClass("err-msg");if(!$("#act-type").val()){$("#msg").append("<div>You need to select an activity type</div>");ret=false;}if(!$("#act-name").val()){$("#msg").append("<div>Please enter a name for the activity</div>");ret=false;}if(!$("#act-pts").val()){$("#msg").append("<div>Please enter a point value for this activity</div>");ret=false;}if(!$("#act-ques").val()){$("#msg").append("<div>Please enter a question to ask the user</div>");ret=false;}if(!$("#act-desc").val()){$("#msg").append("<div>Please enter a long description for the question</div>");10 $(".fa-edit").click(edit_activity);}reset_activity_form();},error:function(xhr,status,error){console.error(error);},dataType:"json",method:"post"});}function change_act_type(){$("#act-labels,#act-min,#act-max").hide();if($("#act-type").val()=="checkbox"||$("#act-type").val()=="radio"){$("#act-labels").show();}else{if($("#act-type").val()=="text"||$("#act-type").val()=="number"){$("#act-min,#act-max").show();}}}function edit_activity(){$.ajax(ajaxurl,{data:{action:"get-activity-details","act-id":$(this).data("id"),"chal-id":$("#challenge_activities").val()},beforeSend:beforeAjaxSend,complete:ajaxComplete,success:function(data){if(!check_for_error(data)){return; 11 }$("#t-row").val(data.order-1);$("#act-id").val(data.id);$("#act-type").val(data.type);$("#act-name").val(data.name);$("#act-pts").val(data.points);$("#act-chal-max").val(data.chal_max);$("#act-ques").val(data.question);$("#act-desc").val(data.desc);$("#act-order").val(data.order);$("#act-labels").val(data.label);$("#act-min").val(data.min);$("#act-max").val(data.max);change_act_type();},error:function(xhr,status,error){console.error(error);},dataType:"json",method:"post"});}function validate_activity(){var ret=true; 12 $("#msg span").remove();$("#msg").removeClass("err-msg");if(!$("#act-type").val()){$("#msg").append("<div>You need to select an activity type</div>");ret=false;}if(!$("#act-name").val()){$("#msg").append("<div>Please enter a name for the activity</div>");ret=false;}if(!$("#act-pts").val()){$("#msg").append("<div>Please enter a point value for this activity</div>");ret=false;}if(!$("#act-ques").val()){$("#msg").append("<div>Please enter a question to ask the user</div>");ret=false;}if(!$("#act-desc").val()){$("#msg").append("<div>Please enter a long description for the question</div>"); 13 13 ret=false;}if(!$("#act-order").val()){$("#msg").append("<div>Please enter a numeric order for the question to appear</div>");ret=false;}return ret;}function reset_activity_form(){$("#act-type,#act-name,#act-ques,#act-desc,#act-labels,#act-id").val("");$("#act-pts,#act-chal-max,#act-order,#act-min,#act-max").val(0);$("#act-labels,#act-min,#act-max").hide();}$("#save-activity").click(save_activity);$("#challenge_activities").change(get_challenge_activities);$("#act-type").change(change_act_type);function get_participants(){if(!$("#challenge_participants").val()){return; 14 14 }$.ajax(ajaxurl,{data:{"action":"get-participants","chal-id":$("#challenge_participants").val()},beforeSend:beforeAjaxSend,complete:ajaxComplete,success:function(data){if($.fn.DataTable.isDataTable("#participant-table")){table1.destroy();$("#participant-table").empty();}table1=$("#participant-table").DataTable({data:data.data.slice(0),columns:data.columns.slice(0),order:[[4,"desc"]],buttons:["copyHtml5","csv","excel","pdf","print"],dom:"Bfrtip"});$(".approve").click(approve_participant);$(".fa-trash-alt").click(remove_participant); -
point-tracker/tags/1.1/includes/ajax/activity-ajax.php
r1924930 r1925352 113 113 $act = $wpdb->get_row($wpdb->prepare($query, $act_id, $chal_id)); 114 114 115 if(!$act) { 116 print json_encode([ 117 'error' => 'Unable to find that activity' 118 ]); 119 wp_die(); 120 } 121 115 122 $act->name = html_entity_decode($act->name, ENT_QUOTES | ENT_HTML5); 116 123 $act->desc = html_entity_decode($act->desc, ENT_QUOTES | ENT_HTML5); -
point-tracker/tags/1.1/includes/ajax/participant-ajax.php
r1924930 r1925352 21 21 $chal_id = filter_input(INPUT_POST, 'chal-id', FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE); 22 22 $chal = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}pt_challenges WHERE id = %d", $chal_id)); 23 23 24 24 if(!$chal) { 25 25 print json_encode([ … … 302 302 global $wpdb; 303 303 304 $chal_ id = filter_input(INPUT_POST, 'chal-id', FILTER_SANITIZE_STRING, FILTER_NULL_ON_FAILURE);304 $chal_link = filter_input(INPUT_POST, 'chal-link', FILTER_SANITIZE_STRING, FILTER_NULL_ON_FAILURE); 305 305 $member_id = filter_input(INPUT_POST, 'member-id', FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE); 306 306 307 $query = $wpdb->prepare("SELECT * FROM {$wpdb->prefix}pt_challenges WHERE " . (is_numeric($chal_id) ? "id=%d" : "short_link=%s"), $chal_id);307 $query = $wpdb->prepare("SELECT * FROM {$wpdb->prefix}pt_challenges WHERE short_link = %s", $chal_link); 308 308 $chal = $wpdb->get_row($query); 309 309 … … 315 315 } 316 316 317 $name = sanitize_text_field(filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING, FILTER_NULL_ON_FAILURE)); 318 $email = sanitize_email(filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL, FILTER_NULL_ON_FAILURE)); 319 317 320 $now = new DateTime("now", new DateTimeZone(get_option("timezone_string"))); 318 $user = wp_get_current_user();319 320 $fname = get_user_meta($user->ID, 'first_name', true);321 $lname = get_user_meta($user->ID, 'last_name', true);322 $name = $user->data->display_name;323 if($fname && $lname) {324 $name = "{$fname} {$lname}";325 }326 321 327 322 $res = $wpdb->insert("{$wpdb->prefix}pt_participants", [ … … 332 327 'date_approved' => ($chal->approval ? null : $now->format("Y-m-d")), 333 328 'member_id' => $member_id, 334 'name' => sanitize_text_field($name), 335 'email' => $user->user_email 336 ]); 337 338 wp_mail(get_option('admin_email'), "Participant joined {$chal->name}", str_replace( 339 ["{name}", "{chal}"], [$name, $chal->name], PT_NEW_PARTICIPANT 340 )); 329 'name' => $name, 330 'email' => $email 331 ]); 332 333 $chal_name = html_entity_decode($chal->name, ENT_QUOTES | ENT_HTML5); 334 335 if (get_option('admin_email', null)) { 336 wp_mail(get_option('admin_email'), "Participant joined {$chal_name}", str_replace([ 337 "{name}", 338 "{chal}" 339 ], [ 340 html_entity_decode($name, ENT_QUOTES | ENT_HTML5), 341 $chal_name 342 ], PT_NEW_PARTICIPANT)); 343 } 341 344 342 345 print json_encode($res ? [ -
point-tracker/tags/1.1/includes/class-point-tracker.php
r1924930 r1925352 218 218 $now = new DateTime("now", new DateTimeZone(get_option('timezone_string'))); 219 219 220 if($list && !$chal_link) { 220 if(is_plugin_active('wordpress-seo/wp-seo.php')) { 221 wp_die("Yoast SEO currently has a conflict with Point Tracker. Deactivate Yoast SEO first, activiate/deactivate Point Tracker, then reactivate Yoast SEO"); 222 } elseif($list && !$chal_link) { 221 223 return null; 222 224 } -
point-tracker/tags/1.1/public/class-point-tracker-public.php
r1924930 r1925352 141 141 wp_enqueue_script('jquery-ui-datepicker'); 142 142 wp_enqueue_script('jquery-ui-tooltip'); 143 wp_enqueue_script('jquery-ui-dialog'); 143 144 144 145 wp_enqueue_script('datatables', plugin_dir_url(__DIR__) . "includes/datatables/DataTables-1.10.9/js/jquery.dataTables.min.js"); -
point-tracker/tags/1.1/public/js/point-tracker-public.min.js
r1924930 r1925352 1 jQuery(function($){function join_challenge(){var member_id=prompt("Please enter your member ID","Member ID");if(!member_id.match(/^[\d]+$/)){alert("Invalid member ID");return;}$.ajax(ajax_object.ajax_url,{data:{"action":"join-challenge","chal-id":$("#chal-link").val(),"member-id":member_id},beforeSend:beforeAjaxSend,complete:ajaxComplete,success:function(data){if(!check_for_error(data)){return;}alert(data.success);if(data.redirect){location.href=ajax_object.chal_page+"/?chal="+id;}},error:function(xhr,status,error){console.error(error); 2 },dataType:"json",method:"post"});}function get_my_activity(){$("#msg").html("");var numeric=/^\d+$/;if(!$("#member-id").val()||!$("#member-id").val().match(numeric)){$("#msg").append("<div>Please enter a valid member ID</div>");$("#msg").slideToggle(300);$("#msg").addClass("warn-msg");setTimeout(function(){$("#msg").slideToggle(300);},5000);return false;}else{if(!$("#email").val()){$("#msg").append("<div>Please enter your email</div>");$("#msg").slideToggle(300);$("#msg").addClass("warn-msg");setTimeout(function(){$("#msg").slideToggle(300); 3 },5000);return false;}}$.ajax(ajax_object.ajax_url,{data:{action:"get-my-activity","member-id":$("#member-id").val(),"email":$("#email").val(),"chal-id":$("#chal-id").val()},beforeSend:beforeAjaxSend,complete:ajaxComplete,success:function(data){if(!check_for_error(data)){return;}$("#total-points").html(data.total_points);if($.fn.DataTable.isDataTable("#my-activity-table")){table.destroy();$("#my-activity-table").empty();}table=$("#my-activity-table").DataTable({data:data.data.slice(0),columns:data.columns.slice(0),paging:false,buttons:["copyHtml5","csv","excel","pdf","print"],dom:"Bfrtip",searching:false}); 4 $(".fa-trash-alt").click(delete_activity);},error:function(xhr,status,error){console.error(error);},method:"post",dataType:"json"});}function save_activity(){var start=$(this).parent().parent();var type=$(start).find(".type").val();var value="";if(!validate_entry(start)){return;}if(type=="checkbox"){var length=$(start).find("input[type='checkbox']:checked").length;if(length>1){value=[];for(var x=0;x<length;x++){value.push($(start).find("input[type='checkbox']:checked").eq(x).val());}}else{value=$(start).find("input[type='checkbox']:checked").val(); 5 }}else{if(type=="radio"){value=$(start).find("input[type='radio']:checked").val();}else{value=$(start).find("input.value").val();}}$.ajax(ajax_object.ajax_url,{data:{"action":"save-entry","act-id":$(start).find(".id").val(),"type":type,"value":value,"member-id":$("#member-id").val(),"user-name":$("#user-name").val(),"user-email":$("#user-email").val()},beforeSend:beforeAjaxSend,complete:ajaxComplete,success:function(data){$("#msg").html("");$("#msg").removeClass("err-msg,warn-msg");var duration=1500;if(data.error){$("#msg").html("<p>"+data.error+"</p>"); 6 $("#msg").addClass("err-msg");duration=5000;}else{if(data.warning){$("#msg").html("<p>"+data.warning+"</p>");$("#msg").addClass("warn-msg");duration=3000;}else{$("#msg").html("<p>Activity saved</p>");}}$("#msg").css("top",$(start).position().top+5);$("#msg").height($(start).height()+2);$("#msg").slideToggle(300);setTimeout(function(){$("#msg").slideToggle(300);},duration);},error:function(xhr,status,error){console.error(error);},dataType:"json",method:"post"});}function delete_activity(){var button=$(this);$.ajax(ajax_object.ajax_url,{data:{"action":"delete-participant-activity","act-id":$(this).data("act-id"),"user-id":$(this).data("user-id"),"log-date":$(this).data("log-date"),"security":$("#_wpnonce").val()},beforeSend:beforeAjaxSend,complete:ajaxComplete,success:function(data){if(!check_for_error(data)){return; 7 }table.row($(button).closest("tr").index()).remove().draw();},error:function(xhr,status,error){console.error(error);},dataType:"json",method:"post"});}function validate_entry(act){var numeric=/^\d+$/;var ret=true;var type=$(act).find("input.type").val();$("#msg div").remove();$("#msg").removeClass("err-msg");$("#msg").removeClass("warn-msg");if(!$("#member-id").val()||!$("#member-id").val().match(numeric)){$("#msg").append("<div>That is an invalid member ID</div>");ret=false;}if(!$("#user-name").val()){$("#msg").append("<div>You need to put your name in the form</div>"); 8 ret=false;}if(!$("#user-email").val()){$("#msg").append("<div>You need to enter your e-mail address</div>");ret=false;}if(type=="checkbox"||type=="radio"){if(!$(act).find("input[type="+type+"]:checked").length){$("#msg").append("<div>You must select one of the options</div>");ret=false;}}else{if(type=="text"){if(!$(act).find('input[type="text"]').val().length){$("#msg").append("<div>Invalid entry for this activity</div>");ret=false;}}else{if(type=="number"){var num=$(act).find('input[type="number"]').val();if(!num.match(numeric)){$("#msg").append("<div>Invalid entry for this activity</div>"); 9 ret=false;}else{if(parseInt(num)<1){$("#msg").append("<div>Invalid entry for this activity, positive numbers only</div>");ret=false;}}}}}if(!ret){$("#msg").slideToggle(300);$("#msg").addClass("warn-msg");setTimeout(function(){$("#msg").slideToggle(300);},5000);}return ret;}function check_for_error(data){$("#msg div").remove();$("#msg").removeClass("err-msg,warn-msg");var err=false;if(data=="0"){$("#msg").html("<div>There was an error</div>");$("#msg").addClass("err-msg");err=true;}else{if(data.error){$("#msg").html("<div>"+data.error+"</div>"); 10 $("#msg").addClass("err-msg");err=true;}else{if(data.warning){$("#msg").html("<div>"+data.warning+"</div>");$("#msg").addClass("warn-msg");err=true;}else{if(data.success){$("#msg").html("<div>"+data.success+"</div>");}}}}if($("#msg").html()){$("#msg").show(300);}if(err){setTimeout(function(){$("#msg").hide(300);$("#msg").html("");},3000);}else{setTimeout(function(){$("#msg").hide(300);$("#msg").html("");},1500);}return !err;}function beforeAjaxSend(){$("#loading,#waiting").show();$("#waiting").animate({"opacity":"0.5"},300,"linear"); 11 }function ajaxComplete(){$("#loading,#waiting").hide();$("#waiting").animate({"opacity":"0"},300,"linear");}var opts={lines:25,length:25,width:5,radius:50,scale:1,corners:1,color:"#000",opacity:0.25,rotate:0,direction:1,speed:0.5,trail:60,fps:20,zIndex:2000000000,className:"spinner",top:"50%",left:"50%",shadow:false,hwaccel:false,position:"absolute"};var target,spinner,table;$("#registered-challenges,#upcoming-challenges,#past-challenges").DataTable({paging:false,searching:false});$(".tooltip-field").tooltip({show:{effect:"slideDown",delay:100},hide:{effect:"slideUp",delay:250}}); 12 $("#join-challenge").click(join_challenge);$(".save").click(save_activity);$("#get-activity").click(get_my_activity);$("#msg").hide();if($("#loading")){target=document.getElementById("loading");spinner=new Spinner(opts).spin(target);}if($("#my-activity-body tr").length){table=$("#my-activity-table").DataTable({paging:false,buttons:["copyHtml5","csv","excel","pdf","print"],dom:"Bfrtip",searching:false,stripClasses:["odd-row","even-row"],order:[[0,"asc"],[2,"asc"]]});$(".fa-trash-alt").click(delete_activity);}}); 1 jQuery(function($){function join_challenge(){var numeric=/^\d+$/;var good=true;if(!$("#member-id").val().match(numeric)){good=check_for_error({error:"Invalid member ID"});}if(good&&!$("#name").val()){good=check_for_error({error:"Invalid name"});}if(good&&!$("#email").val()){good=check_for_error({error:"Invalid email"});}if(good){$.ajax(ajax_object.ajax_url,{data:{"action":"join-challenge","chal-link":$("#chal-link").val(),"member-id":$("#member-id").val(),"name":$("#name").val(),"email":$("#email").val()},beforeSend:beforeAjaxSend,complete:ajaxComplete,success:function(data){if(!check_for_error(data)){return; 2 }alert(data.success);if(data.redirect){location.href=ajax_object.chal_page+"/?chal="+id;}},error:function(xhr,status,error){console.error(error);},dataType:"json",method:"post"});}dialog.dialog("close");}function get_my_activity(){$("#msg").html("");var numeric=/^\d+$/;if(!$("#member-id").val()||!$("#member-id").val().match(numeric)){$("#msg").append("<div>Please enter a valid member ID</div>");$("#msg").slideToggle(300);$("#msg").addClass("warn-msg");setTimeout(function(){$("#msg").slideToggle(300);},5000); 3 return false;}else{if(!$("#email").val()){$("#msg").append("<div>Please enter your email</div>");$("#msg").slideToggle(300);$("#msg").addClass("warn-msg");setTimeout(function(){$("#msg").slideToggle(300);},5000);return false;}}$.ajax(ajax_object.ajax_url,{data:{action:"get-my-activity","member-id":$("#member-id").val(),"email":$("#email").val(),"chal-id":$("#chal-id").val()},beforeSend:beforeAjaxSend,complete:ajaxComplete,success:function(data){if(!check_for_error(data)){return;}$("#total-points").html(data.total_points); 4 if($.fn.DataTable.isDataTable("#my-activity-table")){table.destroy();$("#my-activity-table").empty();}table=$("#my-activity-table").DataTable({data:data.data.slice(0),columns:data.columns.slice(0),paging:false,buttons:["copyHtml5","csv","excel","pdf","print"],dom:"Bfrtip",searching:false});$(".fa-trash-alt").click(delete_activity);},error:function(xhr,status,error){console.error(error);},method:"post",dataType:"json"});}function save_activity(){var start=$(this).parent().parent();var type=$(start).find(".type").val(); 5 var value="";if(!validate_entry(start)){return;}if(type=="checkbox"){var length=$(start).find("input[type='checkbox']:checked").length;if(length>1){value=[];for(var x=0;x<length;x++){value.push($(start).find("input[type='checkbox']:checked").eq(x).val());}}else{value=$(start).find("input[type='checkbox']:checked").val();}}else{if(type=="radio"){value=$(start).find("input[type='radio']:checked").val();}else{value=$(start).find("input.value").val();}}$.ajax(ajax_object.ajax_url,{data:{"action":"save-entry","act-id":$(start).find(".id").val(),"type":type,"value":value,"member-id":$("#member-id").val(),"user-name":$("#user-name").val(),"user-email":$("#user-email").val()},beforeSend:beforeAjaxSend,complete:ajaxComplete,success:function(data){$("#msg").html(""); 6 $("#msg").removeClass("err-msg,warn-msg");var duration=1500;if(data.error){$("#msg").html("<p>"+data.error+"</p>");$("#msg").addClass("err-msg");duration=5000;}else{if(data.warning){$("#msg").html("<p>"+data.warning+"</p>");$("#msg").addClass("warn-msg");duration=3000;}else{$("#msg").html("<p>Activity saved</p>");}}$("#msg").css("top",$(start).position().top+5);$("#msg").height($(start).height()+2);$("#msg").slideToggle(300);setTimeout(function(){$("#msg").slideToggle(300);},duration);},error:function(xhr,status,error){console.error(error); 7 },dataType:"json",method:"post"});}function delete_activity(){var button=$(this);$.ajax(ajax_object.ajax_url,{data:{"action":"delete-participant-activity","act-id":$(this).data("act-id"),"user-id":$(this).data("user-id"),"log-date":$(this).data("log-date"),"security":$("#_wpnonce").val()},beforeSend:beforeAjaxSend,complete:ajaxComplete,success:function(data){if(!check_for_error(data)){return;}table.row($(button).closest("tr").index()).remove().draw();},error:function(xhr,status,error){console.error(error);},dataType:"json",method:"post"}); 8 }function validate_entry(act){var numeric=/^\d+$/;var ret=true;var type=$(act).find("input.type").val();$("#msg div").remove();$("#msg").removeClass("err-msg");$("#msg").removeClass("warn-msg");if(!$("#member-id").val()||!$("#member-id").val().match(numeric)){$("#msg").append("<div>That is an invalid member ID</div>");ret=false;}if(!$("#user-name").val()){$("#msg").append("<div>You need to put your name in the form</div>");ret=false;}if(!$("#user-email").val()){$("#msg").append("<div>You need to enter your e-mail address</div>"); 9 ret=false;}if(type=="checkbox"||type=="radio"){if(!$(act).find("input[type="+type+"]:checked").length){$("#msg").append("<div>You must select one of the options</div>");ret=false;}}else{if(type=="text"){if(!$(act).find('input[type="text"]').val().length){$("#msg").append("<div>Invalid entry for this activity</div>");ret=false;}}else{if(type=="number"){var num=$(act).find('input[type="number"]').val();if(!num.match(numeric)){$("#msg").append("<div>Invalid entry for this activity</div>");ret=false;}else{if(parseInt(num)<1){$("#msg").append("<div>Invalid entry for this activity, positive numbers only</div>"); 10 ret=false;}}}}}if(!ret){$("#msg").slideToggle(300);$("#msg").addClass("warn-msg");setTimeout(function(){$("#msg").slideToggle(300);},5000);}return ret;}function check_for_error(data){$("#msg div").remove();$("#msg").removeClass("err-msg,warn-msg");var err=false;if(data=="0"){$("#msg").html("<div>There was an error</div>");$("#msg").addClass("err-msg");err=true;}else{if(data.error){$("#msg").html("<div>"+data.error+"</div>");$("#msg").addClass("err-msg");err=true;}else{if(data.warning){$("#msg").html("<div>"+data.warning+"</div>"); 11 $("#msg").addClass("warn-msg");err=true;}else{if(data.success){$("#msg").html("<div>"+data.success+"</div>");}}}}if($("#msg").html()){$("#msg").show(300);}if(err){setTimeout(function(){$("#msg").hide(300);$("#msg").html("");},3000);}else{setTimeout(function(){$("#msg").hide(300);$("#msg").html("");},1500);}return !err;}function beforeAjaxSend(){$("#loading,#waiting").show();$("#waiting").animate({"opacity":"0.5"},300,"linear");}function ajaxComplete(){$("#loading,#waiting").hide();$("#waiting").animate({"opacity":"0"},300,"linear"); 12 }var opts={lines:25,length:25,width:5,radius:50,scale:1,corners:1,color:"#000",opacity:0.25,rotate:0,direction:1,speed:0.5,trail:60,fps:20,zIndex:2000000000,className:"spinner",top:"50%",left:"50%",shadow:false,hwaccel:false,position:"absolute"};var target,spinner,table;$("#registered-challenges,#upcoming-challenges,#past-challenges").DataTable({paging:false,searching:false});$(".tooltip-field").tooltip({show:{effect:"slideDown",delay:100},hide:{effect:"slideUp",delay:250}});dialog=$("#dialog-form").dialog({autoOpen:false,height:500,width:350,modal:true,buttons:{"Join Challenge":join_challenge,Cancel:function(){dialog.dialog("close"); 13 }},close:function(){form[0].reset();}});form=dialog.find("form").on("submit",function(event){event.preventDefault();join_challenge();});$("#join-challenge").button().on("click",function(){dialog.dialog("open");});$(".save").click(save_activity);$("#get-activity").click(get_my_activity);$("#msg").hide();if($("#loading")){target=document.getElementById("loading");spinner=new Spinner(opts).spin(target);}if($("#my-activity-body tr").length){table=$("#my-activity-table").DataTable({paging:false,buttons:["copyHtml5","csv","excel","pdf","print"],dom:"Bfrtip",searching:false,stripClasses:["odd-row","even-row"],order:[[0,"asc"],[2,"asc"]]}); 14 $(".fa-trash-alt").click(delete_activity);}}); -
point-tracker/tags/1.1/public/partials/point-tracker-challenge-list-pg.php
r1924930 r1925352 39 39 ]); 40 40 } 41 42 $user = wp_get_current_user(); 41 43 42 44 $now = new DateTime("now", new DateTimeZone(get_option('timezone_string'))); … … 166 168 </table> 167 169 168 <?php } 170 <?php 171 } 169 172 173 ?> 174 175 176 <div id="dialog-form" title="Add new leader"> 177 <p class="validateTips">All form fields are required.</p> 178 179 <form> 180 <fieldset> 181 <input type="text" id="member-id" placeholder="Member ID..." 182 inputmode='numeric' pattern='[0-9]*' 183 class="text ui-widget-content ui-corner-all" /> 184 <input type="text" id="name" placeholder="Name..." value='<?php print $user->display_name; ?>' 185 class="text ui-widget-content ui-corner-all" /> 186 <input type='email' id='email' placeholder='Email...' value='<?php print $user->user_email; ?>' 187 class='text ui-widget-content ui-corner-all' /> 188 189 <!-- Allow form submission with keyboard without duplicating the dialog button --> 190 <input type="submit" tabindex="-1" 191 style="position: absolute; top: -1000px"> 192 </fieldset> 193 </form> 194 </div> 195 -
point-tracker/tags/1.1/public/partials/point-tracker-challenge-pg.php
r1924930 r1925352 135 135 $inputmode = ($act->type == 'number' ? " inputmode='numeric' pattern='[0-9]*'" : null); 136 136 137 print "<label for='$id'>{$ques} <small>({$act->points} pts)</small></label><br />";138 137 print "<input type='{$act->type}' class='value' id='$id'$inputmode $min $max $val /> "; 139 138 } … … 210 209 $inputmode = ($act->type == 'number' ? " inputmode='numeric' pattern='[0-9]*'" : null); 211 210 212 print "<label for='$id'>{$ques} <small>({$act->points} pts)</small></label><br />";213 211 print "<input type='{$act->type}' class='value' id='$id'$inputmode $min $max $val /> "; 214 212 } -
point-tracker/tags/1.1/public/partials/point-tracker-my-activity-pg.php
r1924930 r1925352 31 31 $user = wp_get_current_user(); 32 32 33 $wpdb->query($wpdb->prepare("SET @challenge_id=%d", $chal->id)); 34 $tp = $wpdb->get_var($wpdb->prepare("SELECT SUM(total_points) FROM {$wpdb->prefix}leader_board WHERE user_id = %d", $user->ID)); 35 33 36 $query = $wpdb->prepare("SELECT 34 37 ca.*,al.* … … 47 50 <input type='hidden' id='_wpnonce' value='<?php print wp_create_nonce('pt-delete-entry'); ?>' /> 48 51 <input type='hidden' id='chal' value='<?php print $chal->short_link; ?>' /> 52 <div id='tp'>Total Points: <span id='total-points'><?php print ($tp ? $tp : 0); ?></span></div> 49 53 <div id='left-half'> 50 54 <table id='my-activity-table' class="stripe"> -
point-tracker/trunk/README.txt
r1924930 r1925352 1 1 === Plugin Name === 2 P lugin Name: Point Tracker2 Point Tracker 3 3 Contributors: godsgood33 4 Tags: team activities 4 Tags: team activities, challenge, content 5 5 Requires at least: 4.4.2 6 6 Requires PHP: 5.6 … … 14 14 == Description == 15 15 16 This plugin does not require but works well with membership plugins. The admin can create a challenge, 17 share the challenge link with whom they wish. Those wishing to participate can click on the link and opt to join the challenge. 18 Once the participant has joined the challenge, they can enter activity against that challenge upto daily and receive points. 19 Leader boards are available if the admin opts to have the system make one available. 16 This plugin does not require but works well with membership plugins. The admin can create a challenge, share the challenge link with whom they wish. Those wishing to participate can click on the link and opt to join the challenge. Once the participant has joined the challenge, they can enter activity against that challenge upto daily and receive points. Leader boards are available if the admin opts to have the system make one available. 20 17 21 18 == Installation == … … 26 23 2. Activate the plugin through the 'Plugins' menu in WordPress 27 24 3. The Point Tracker admin menu is used to administer the challenges, its activitie, and participants. 28 4. There is a PT Settings page under the Settings menu to control options for the Point Tracker 25 4. Navigate to the Point Tracker -> Point Tracker admin menu 26 5. Fill out the form and create a challenge (add a name, start and end dates, and a description) then click "Save" 27 6. Copy the link that appears just above the description box 28 7. Navigate to the Point Tracker -> Activities admin menu 29 8. Select the challenge you just created from the drop down 30 9. Fill out the boxes and create your first activity for that challenge and click "Save" 31 10. Send the link to whomever you wish to get them to join 32 11. Under Settings -> PT Settings there are global options that you can enable, right now, it is only requiring an account for those wanting to participate in a challenge 29 33 30 34 == Frequently Asked Questions == … … 40 44 The challenge will automatically approve all pending participants and any future participants will automatically be approved 41 45 46 = Once the challenge is over what happens? = 47 48 You will need to visit the Point Tracker -> Participants page to see who has the most points 49 50 = A participant entered some wrong information, what do I do? = 51 52 You can either delete it yourself or if they visit the View My Activity page (/my-activity/?chal={linkcode}), they will be able to delete it themselves 53 54 = I'd like a leader board = 55 56 One will be available in Point Tracker Pro releasing soon 57 42 58 == Screenshots == 43 59 … … 45 61 2. This is a screenshot of the Challenge editor 46 62 3. This is a screenshot of the Activity editor 47 4. This is a screenshot of the admin Leader Board 48 5. This is a screenshot of the participant log 63 4. This is a screenshot of the Participant list 64 5. This is a screenshot of the Entry log 65 6. This is a screenshot of an example challenge and activities 66 7. This is a screenshot of the "View My Activity" page after a test user has saved some activities 49 67 50 68 == Changelog == … … 53 71 * Initial release 54 72 73 = 1.1 = 74 * Couple bug fixes 75 * Add screenshots 76 * 77 55 78 == Upgrade Notice == 56 79 -
point-tracker/trunk/admin/js/point-tracker-admin.min.js
r1924930 r1925352 8 8 }var t=$("#activity-table").DataTable();if(!$("#act-id").val()){t.row.add({order:$("#act-order").val(),type:$("#act-type option:selected").text(),name:data.name,points:$("#act-pts").val(),chal_max:($("#act-chal-max").val()?$("#act-chal-max").val():0),question:data.question,desc:data.desc,extras:($("#act-type").val()==="checkbox"||$("#act-type").val()==="radio"?data.label:($("#act-min").val()?$("#act-min").val():0)+"/"+($("#act-max").val()?$("#act-max").val():0)),action:"<i class='fas fa-edit' data-id='"+data.id+"'></i> <i class='far fa-trash-alt' data-id='"+data.id+"'></i>"}).draw(false); 9 9 }else{var tmp=t.row($("#t-row").val()).data();tmp.order=$("#act-order").val();tmp.type=$("#act-type option:selected").text();tmp.name=data.name;tmp.points=$("#act-pts").val();tmp.chal_max=($("#act-chal-max").val()?$("#act-chal-max").val():0);tmp.question=data.question;tmp.desc=data.desc;tmp.extras=($("#act-type").val()==="checkbox"||$("#act-type").val()==="radio"?data.label:($("#act-min").val()?$("#act-min").val():0)+"/"+($("#act-max").val()?$("#act-max").val():0));t.row($("#t-row").val()).invalidate(tmp).draw(); 10 $(".fa-edit").click(edit_activity);}reset_activity_form();},error:function(xhr,status,error){console.error(error);},dataType:"json",method:"post"});}function change_act_type(){$("#act-labels,#act-min,#act-max").hide();if($("#act-type").val()=="checkbox"||$("#act-type").val()=="radio"){$("#act-labels").show();}else{if($("#act-type").val()=="text"||$("#act-type").val()=="number"){$("#act-min,#act-max").show();}}}function edit_activity(){$.ajax(ajaxurl,{data:{action:"get-activity-details","act-id":$(this).data("id") },beforeSend:beforeAjaxSend,complete:ajaxComplete,success:function(data){$("#t-row").val(data.order-1);11 $("#act-id").val(data.id);$("#act-type").val(data.type);$("#act-name").val(data.name);$("#act-pts").val(data.points);$("#act-chal-max").val(data.chal_max);$("#act-ques").val(data.question);$("#act-desc").val(data.desc);$("#act-order").val(data.order);$("#act-labels").val(data.label);$("#act-min").val(data.min);$("#act-max").val(data.max);change_act_type();},error:function(xhr,status,error){console.error(error);},dataType:"json",method:"post"});}function validate_activity(){var ret=true;$("#msg span").remove();12 $("#msg ").removeClass("err-msg");if(!$("#act-type").val()){$("#msg").append("<div>You need to select an activity type</div>");ret=false;}if(!$("#act-name").val()){$("#msg").append("<div>Please enter a name for the activity</div>");ret=false;}if(!$("#act-pts").val()){$("#msg").append("<div>Please enter a point value for this activity</div>");ret=false;}if(!$("#act-ques").val()){$("#msg").append("<div>Please enter a question to ask the user</div>");ret=false;}if(!$("#act-desc").val()){$("#msg").append("<div>Please enter a long description for the question</div>");10 $(".fa-edit").click(edit_activity);}reset_activity_form();},error:function(xhr,status,error){console.error(error);},dataType:"json",method:"post"});}function change_act_type(){$("#act-labels,#act-min,#act-max").hide();if($("#act-type").val()=="checkbox"||$("#act-type").val()=="radio"){$("#act-labels").show();}else{if($("#act-type").val()=="text"||$("#act-type").val()=="number"){$("#act-min,#act-max").show();}}}function edit_activity(){$.ajax(ajaxurl,{data:{action:"get-activity-details","act-id":$(this).data("id"),"chal-id":$("#challenge_activities").val()},beforeSend:beforeAjaxSend,complete:ajaxComplete,success:function(data){if(!check_for_error(data)){return; 11 }$("#t-row").val(data.order-1);$("#act-id").val(data.id);$("#act-type").val(data.type);$("#act-name").val(data.name);$("#act-pts").val(data.points);$("#act-chal-max").val(data.chal_max);$("#act-ques").val(data.question);$("#act-desc").val(data.desc);$("#act-order").val(data.order);$("#act-labels").val(data.label);$("#act-min").val(data.min);$("#act-max").val(data.max);change_act_type();},error:function(xhr,status,error){console.error(error);},dataType:"json",method:"post"});}function validate_activity(){var ret=true; 12 $("#msg span").remove();$("#msg").removeClass("err-msg");if(!$("#act-type").val()){$("#msg").append("<div>You need to select an activity type</div>");ret=false;}if(!$("#act-name").val()){$("#msg").append("<div>Please enter a name for the activity</div>");ret=false;}if(!$("#act-pts").val()){$("#msg").append("<div>Please enter a point value for this activity</div>");ret=false;}if(!$("#act-ques").val()){$("#msg").append("<div>Please enter a question to ask the user</div>");ret=false;}if(!$("#act-desc").val()){$("#msg").append("<div>Please enter a long description for the question</div>"); 13 13 ret=false;}if(!$("#act-order").val()){$("#msg").append("<div>Please enter a numeric order for the question to appear</div>");ret=false;}return ret;}function reset_activity_form(){$("#act-type,#act-name,#act-ques,#act-desc,#act-labels,#act-id").val("");$("#act-pts,#act-chal-max,#act-order,#act-min,#act-max").val(0);$("#act-labels,#act-min,#act-max").hide();}$("#save-activity").click(save_activity);$("#challenge_activities").change(get_challenge_activities);$("#act-type").change(change_act_type);function get_participants(){if(!$("#challenge_participants").val()){return; 14 14 }$.ajax(ajaxurl,{data:{"action":"get-participants","chal-id":$("#challenge_participants").val()},beforeSend:beforeAjaxSend,complete:ajaxComplete,success:function(data){if($.fn.DataTable.isDataTable("#participant-table")){table1.destroy();$("#participant-table").empty();}table1=$("#participant-table").DataTable({data:data.data.slice(0),columns:data.columns.slice(0),order:[[4,"desc"]],buttons:["copyHtml5","csv","excel","pdf","print"],dom:"Bfrtip"});$(".approve").click(approve_participant);$(".fa-trash-alt").click(remove_participant); -
point-tracker/trunk/includes/ajax/activity-ajax.php
r1924930 r1925352 113 113 $act = $wpdb->get_row($wpdb->prepare($query, $act_id, $chal_id)); 114 114 115 if(!$act) { 116 print json_encode([ 117 'error' => 'Unable to find that activity' 118 ]); 119 wp_die(); 120 } 121 115 122 $act->name = html_entity_decode($act->name, ENT_QUOTES | ENT_HTML5); 116 123 $act->desc = html_entity_decode($act->desc, ENT_QUOTES | ENT_HTML5); -
point-tracker/trunk/includes/ajax/participant-ajax.php
r1924930 r1925352 21 21 $chal_id = filter_input(INPUT_POST, 'chal-id', FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE); 22 22 $chal = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}pt_challenges WHERE id = %d", $chal_id)); 23 23 24 24 if(!$chal) { 25 25 print json_encode([ … … 302 302 global $wpdb; 303 303 304 $chal_ id = filter_input(INPUT_POST, 'chal-id', FILTER_SANITIZE_STRING, FILTER_NULL_ON_FAILURE);304 $chal_link = filter_input(INPUT_POST, 'chal-link', FILTER_SANITIZE_STRING, FILTER_NULL_ON_FAILURE); 305 305 $member_id = filter_input(INPUT_POST, 'member-id', FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE); 306 306 307 $query = $wpdb->prepare("SELECT * FROM {$wpdb->prefix}pt_challenges WHERE " . (is_numeric($chal_id) ? "id=%d" : "short_link=%s"), $chal_id);307 $query = $wpdb->prepare("SELECT * FROM {$wpdb->prefix}pt_challenges WHERE short_link = %s", $chal_link); 308 308 $chal = $wpdb->get_row($query); 309 309 … … 315 315 } 316 316 317 $name = sanitize_text_field(filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING, FILTER_NULL_ON_FAILURE)); 318 $email = sanitize_email(filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL, FILTER_NULL_ON_FAILURE)); 319 317 320 $now = new DateTime("now", new DateTimeZone(get_option("timezone_string"))); 318 $user = wp_get_current_user();319 320 $fname = get_user_meta($user->ID, 'first_name', true);321 $lname = get_user_meta($user->ID, 'last_name', true);322 $name = $user->data->display_name;323 if($fname && $lname) {324 $name = "{$fname} {$lname}";325 }326 321 327 322 $res = $wpdb->insert("{$wpdb->prefix}pt_participants", [ … … 332 327 'date_approved' => ($chal->approval ? null : $now->format("Y-m-d")), 333 328 'member_id' => $member_id, 334 'name' => sanitize_text_field($name), 335 'email' => $user->user_email 336 ]); 337 338 wp_mail(get_option('admin_email'), "Participant joined {$chal->name}", str_replace( 339 ["{name}", "{chal}"], [$name, $chal->name], PT_NEW_PARTICIPANT 340 )); 329 'name' => $name, 330 'email' => $email 331 ]); 332 333 $chal_name = html_entity_decode($chal->name, ENT_QUOTES | ENT_HTML5); 334 335 if (get_option('admin_email', null)) { 336 wp_mail(get_option('admin_email'), "Participant joined {$chal_name}", str_replace([ 337 "{name}", 338 "{chal}" 339 ], [ 340 html_entity_decode($name, ENT_QUOTES | ENT_HTML5), 341 $chal_name 342 ], PT_NEW_PARTICIPANT)); 343 } 341 344 342 345 print json_encode($res ? [ -
point-tracker/trunk/includes/class-point-tracker.php
r1924930 r1925352 218 218 $now = new DateTime("now", new DateTimeZone(get_option('timezone_string'))); 219 219 220 if($list && !$chal_link) { 220 if(is_plugin_active('wordpress-seo/wp-seo.php')) { 221 wp_die("Yoast SEO currently has a conflict with Point Tracker. Deactivate Yoast SEO first, activiate/deactivate Point Tracker, then reactivate Yoast SEO"); 222 } elseif($list && !$chal_link) { 221 223 return null; 222 224 } -
point-tracker/trunk/public/class-point-tracker-public.php
r1924930 r1925352 141 141 wp_enqueue_script('jquery-ui-datepicker'); 142 142 wp_enqueue_script('jquery-ui-tooltip'); 143 wp_enqueue_script('jquery-ui-dialog'); 143 144 144 145 wp_enqueue_script('datatables', plugin_dir_url(__DIR__) . "includes/datatables/DataTables-1.10.9/js/jquery.dataTables.min.js"); -
point-tracker/trunk/public/js/point-tracker-public.min.js
r1924930 r1925352 1 jQuery(function($){function join_challenge(){var member_id=prompt("Please enter your member ID","Member ID");if(!member_id.match(/^[\d]+$/)){alert("Invalid member ID");return;}$.ajax(ajax_object.ajax_url,{data:{"action":"join-challenge","chal-id":$("#chal-link").val(),"member-id":member_id},beforeSend:beforeAjaxSend,complete:ajaxComplete,success:function(data){if(!check_for_error(data)){return;}alert(data.success);if(data.redirect){location.href=ajax_object.chal_page+"/?chal="+id;}},error:function(xhr,status,error){console.error(error); 2 },dataType:"json",method:"post"});}function get_my_activity(){$("#msg").html("");var numeric=/^\d+$/;if(!$("#member-id").val()||!$("#member-id").val().match(numeric)){$("#msg").append("<div>Please enter a valid member ID</div>");$("#msg").slideToggle(300);$("#msg").addClass("warn-msg");setTimeout(function(){$("#msg").slideToggle(300);},5000);return false;}else{if(!$("#email").val()){$("#msg").append("<div>Please enter your email</div>");$("#msg").slideToggle(300);$("#msg").addClass("warn-msg");setTimeout(function(){$("#msg").slideToggle(300); 3 },5000);return false;}}$.ajax(ajax_object.ajax_url,{data:{action:"get-my-activity","member-id":$("#member-id").val(),"email":$("#email").val(),"chal-id":$("#chal-id").val()},beforeSend:beforeAjaxSend,complete:ajaxComplete,success:function(data){if(!check_for_error(data)){return;}$("#total-points").html(data.total_points);if($.fn.DataTable.isDataTable("#my-activity-table")){table.destroy();$("#my-activity-table").empty();}table=$("#my-activity-table").DataTable({data:data.data.slice(0),columns:data.columns.slice(0),paging:false,buttons:["copyHtml5","csv","excel","pdf","print"],dom:"Bfrtip",searching:false}); 4 $(".fa-trash-alt").click(delete_activity);},error:function(xhr,status,error){console.error(error);},method:"post",dataType:"json"});}function save_activity(){var start=$(this).parent().parent();var type=$(start).find(".type").val();var value="";if(!validate_entry(start)){return;}if(type=="checkbox"){var length=$(start).find("input[type='checkbox']:checked").length;if(length>1){value=[];for(var x=0;x<length;x++){value.push($(start).find("input[type='checkbox']:checked").eq(x).val());}}else{value=$(start).find("input[type='checkbox']:checked").val(); 5 }}else{if(type=="radio"){value=$(start).find("input[type='radio']:checked").val();}else{value=$(start).find("input.value").val();}}$.ajax(ajax_object.ajax_url,{data:{"action":"save-entry","act-id":$(start).find(".id").val(),"type":type,"value":value,"member-id":$("#member-id").val(),"user-name":$("#user-name").val(),"user-email":$("#user-email").val()},beforeSend:beforeAjaxSend,complete:ajaxComplete,success:function(data){$("#msg").html("");$("#msg").removeClass("err-msg,warn-msg");var duration=1500;if(data.error){$("#msg").html("<p>"+data.error+"</p>"); 6 $("#msg").addClass("err-msg");duration=5000;}else{if(data.warning){$("#msg").html("<p>"+data.warning+"</p>");$("#msg").addClass("warn-msg");duration=3000;}else{$("#msg").html("<p>Activity saved</p>");}}$("#msg").css("top",$(start).position().top+5);$("#msg").height($(start).height()+2);$("#msg").slideToggle(300);setTimeout(function(){$("#msg").slideToggle(300);},duration);},error:function(xhr,status,error){console.error(error);},dataType:"json",method:"post"});}function delete_activity(){var button=$(this);$.ajax(ajax_object.ajax_url,{data:{"action":"delete-participant-activity","act-id":$(this).data("act-id"),"user-id":$(this).data("user-id"),"log-date":$(this).data("log-date"),"security":$("#_wpnonce").val()},beforeSend:beforeAjaxSend,complete:ajaxComplete,success:function(data){if(!check_for_error(data)){return; 7 }table.row($(button).closest("tr").index()).remove().draw();},error:function(xhr,status,error){console.error(error);},dataType:"json",method:"post"});}function validate_entry(act){var numeric=/^\d+$/;var ret=true;var type=$(act).find("input.type").val();$("#msg div").remove();$("#msg").removeClass("err-msg");$("#msg").removeClass("warn-msg");if(!$("#member-id").val()||!$("#member-id").val().match(numeric)){$("#msg").append("<div>That is an invalid member ID</div>");ret=false;}if(!$("#user-name").val()){$("#msg").append("<div>You need to put your name in the form</div>"); 8 ret=false;}if(!$("#user-email").val()){$("#msg").append("<div>You need to enter your e-mail address</div>");ret=false;}if(type=="checkbox"||type=="radio"){if(!$(act).find("input[type="+type+"]:checked").length){$("#msg").append("<div>You must select one of the options</div>");ret=false;}}else{if(type=="text"){if(!$(act).find('input[type="text"]').val().length){$("#msg").append("<div>Invalid entry for this activity</div>");ret=false;}}else{if(type=="number"){var num=$(act).find('input[type="number"]').val();if(!num.match(numeric)){$("#msg").append("<div>Invalid entry for this activity</div>"); 9 ret=false;}else{if(parseInt(num)<1){$("#msg").append("<div>Invalid entry for this activity, positive numbers only</div>");ret=false;}}}}}if(!ret){$("#msg").slideToggle(300);$("#msg").addClass("warn-msg");setTimeout(function(){$("#msg").slideToggle(300);},5000);}return ret;}function check_for_error(data){$("#msg div").remove();$("#msg").removeClass("err-msg,warn-msg");var err=false;if(data=="0"){$("#msg").html("<div>There was an error</div>");$("#msg").addClass("err-msg");err=true;}else{if(data.error){$("#msg").html("<div>"+data.error+"</div>"); 10 $("#msg").addClass("err-msg");err=true;}else{if(data.warning){$("#msg").html("<div>"+data.warning+"</div>");$("#msg").addClass("warn-msg");err=true;}else{if(data.success){$("#msg").html("<div>"+data.success+"</div>");}}}}if($("#msg").html()){$("#msg").show(300);}if(err){setTimeout(function(){$("#msg").hide(300);$("#msg").html("");},3000);}else{setTimeout(function(){$("#msg").hide(300);$("#msg").html("");},1500);}return !err;}function beforeAjaxSend(){$("#loading,#waiting").show();$("#waiting").animate({"opacity":"0.5"},300,"linear"); 11 }function ajaxComplete(){$("#loading,#waiting").hide();$("#waiting").animate({"opacity":"0"},300,"linear");}var opts={lines:25,length:25,width:5,radius:50,scale:1,corners:1,color:"#000",opacity:0.25,rotate:0,direction:1,speed:0.5,trail:60,fps:20,zIndex:2000000000,className:"spinner",top:"50%",left:"50%",shadow:false,hwaccel:false,position:"absolute"};var target,spinner,table;$("#registered-challenges,#upcoming-challenges,#past-challenges").DataTable({paging:false,searching:false});$(".tooltip-field").tooltip({show:{effect:"slideDown",delay:100},hide:{effect:"slideUp",delay:250}}); 12 $("#join-challenge").click(join_challenge);$(".save").click(save_activity);$("#get-activity").click(get_my_activity);$("#msg").hide();if($("#loading")){target=document.getElementById("loading");spinner=new Spinner(opts).spin(target);}if($("#my-activity-body tr").length){table=$("#my-activity-table").DataTable({paging:false,buttons:["copyHtml5","csv","excel","pdf","print"],dom:"Bfrtip",searching:false,stripClasses:["odd-row","even-row"],order:[[0,"asc"],[2,"asc"]]});$(".fa-trash-alt").click(delete_activity);}}); 1 jQuery(function($){function join_challenge(){var numeric=/^\d+$/;var good=true;if(!$("#member-id").val().match(numeric)){good=check_for_error({error:"Invalid member ID"});}if(good&&!$("#name").val()){good=check_for_error({error:"Invalid name"});}if(good&&!$("#email").val()){good=check_for_error({error:"Invalid email"});}if(good){$.ajax(ajax_object.ajax_url,{data:{"action":"join-challenge","chal-link":$("#chal-link").val(),"member-id":$("#member-id").val(),"name":$("#name").val(),"email":$("#email").val()},beforeSend:beforeAjaxSend,complete:ajaxComplete,success:function(data){if(!check_for_error(data)){return; 2 }alert(data.success);if(data.redirect){location.href=ajax_object.chal_page+"/?chal="+id;}},error:function(xhr,status,error){console.error(error);},dataType:"json",method:"post"});}dialog.dialog("close");}function get_my_activity(){$("#msg").html("");var numeric=/^\d+$/;if(!$("#member-id").val()||!$("#member-id").val().match(numeric)){$("#msg").append("<div>Please enter a valid member ID</div>");$("#msg").slideToggle(300);$("#msg").addClass("warn-msg");setTimeout(function(){$("#msg").slideToggle(300);},5000); 3 return false;}else{if(!$("#email").val()){$("#msg").append("<div>Please enter your email</div>");$("#msg").slideToggle(300);$("#msg").addClass("warn-msg");setTimeout(function(){$("#msg").slideToggle(300);},5000);return false;}}$.ajax(ajax_object.ajax_url,{data:{action:"get-my-activity","member-id":$("#member-id").val(),"email":$("#email").val(),"chal-id":$("#chal-id").val()},beforeSend:beforeAjaxSend,complete:ajaxComplete,success:function(data){if(!check_for_error(data)){return;}$("#total-points").html(data.total_points); 4 if($.fn.DataTable.isDataTable("#my-activity-table")){table.destroy();$("#my-activity-table").empty();}table=$("#my-activity-table").DataTable({data:data.data.slice(0),columns:data.columns.slice(0),paging:false,buttons:["copyHtml5","csv","excel","pdf","print"],dom:"Bfrtip",searching:false});$(".fa-trash-alt").click(delete_activity);},error:function(xhr,status,error){console.error(error);},method:"post",dataType:"json"});}function save_activity(){var start=$(this).parent().parent();var type=$(start).find(".type").val(); 5 var value="";if(!validate_entry(start)){return;}if(type=="checkbox"){var length=$(start).find("input[type='checkbox']:checked").length;if(length>1){value=[];for(var x=0;x<length;x++){value.push($(start).find("input[type='checkbox']:checked").eq(x).val());}}else{value=$(start).find("input[type='checkbox']:checked").val();}}else{if(type=="radio"){value=$(start).find("input[type='radio']:checked").val();}else{value=$(start).find("input.value").val();}}$.ajax(ajax_object.ajax_url,{data:{"action":"save-entry","act-id":$(start).find(".id").val(),"type":type,"value":value,"member-id":$("#member-id").val(),"user-name":$("#user-name").val(),"user-email":$("#user-email").val()},beforeSend:beforeAjaxSend,complete:ajaxComplete,success:function(data){$("#msg").html(""); 6 $("#msg").removeClass("err-msg,warn-msg");var duration=1500;if(data.error){$("#msg").html("<p>"+data.error+"</p>");$("#msg").addClass("err-msg");duration=5000;}else{if(data.warning){$("#msg").html("<p>"+data.warning+"</p>");$("#msg").addClass("warn-msg");duration=3000;}else{$("#msg").html("<p>Activity saved</p>");}}$("#msg").css("top",$(start).position().top+5);$("#msg").height($(start).height()+2);$("#msg").slideToggle(300);setTimeout(function(){$("#msg").slideToggle(300);},duration);},error:function(xhr,status,error){console.error(error); 7 },dataType:"json",method:"post"});}function delete_activity(){var button=$(this);$.ajax(ajax_object.ajax_url,{data:{"action":"delete-participant-activity","act-id":$(this).data("act-id"),"user-id":$(this).data("user-id"),"log-date":$(this).data("log-date"),"security":$("#_wpnonce").val()},beforeSend:beforeAjaxSend,complete:ajaxComplete,success:function(data){if(!check_for_error(data)){return;}table.row($(button).closest("tr").index()).remove().draw();},error:function(xhr,status,error){console.error(error);},dataType:"json",method:"post"}); 8 }function validate_entry(act){var numeric=/^\d+$/;var ret=true;var type=$(act).find("input.type").val();$("#msg div").remove();$("#msg").removeClass("err-msg");$("#msg").removeClass("warn-msg");if(!$("#member-id").val()||!$("#member-id").val().match(numeric)){$("#msg").append("<div>That is an invalid member ID</div>");ret=false;}if(!$("#user-name").val()){$("#msg").append("<div>You need to put your name in the form</div>");ret=false;}if(!$("#user-email").val()){$("#msg").append("<div>You need to enter your e-mail address</div>"); 9 ret=false;}if(type=="checkbox"||type=="radio"){if(!$(act).find("input[type="+type+"]:checked").length){$("#msg").append("<div>You must select one of the options</div>");ret=false;}}else{if(type=="text"){if(!$(act).find('input[type="text"]').val().length){$("#msg").append("<div>Invalid entry for this activity</div>");ret=false;}}else{if(type=="number"){var num=$(act).find('input[type="number"]').val();if(!num.match(numeric)){$("#msg").append("<div>Invalid entry for this activity</div>");ret=false;}else{if(parseInt(num)<1){$("#msg").append("<div>Invalid entry for this activity, positive numbers only</div>"); 10 ret=false;}}}}}if(!ret){$("#msg").slideToggle(300);$("#msg").addClass("warn-msg");setTimeout(function(){$("#msg").slideToggle(300);},5000);}return ret;}function check_for_error(data){$("#msg div").remove();$("#msg").removeClass("err-msg,warn-msg");var err=false;if(data=="0"){$("#msg").html("<div>There was an error</div>");$("#msg").addClass("err-msg");err=true;}else{if(data.error){$("#msg").html("<div>"+data.error+"</div>");$("#msg").addClass("err-msg");err=true;}else{if(data.warning){$("#msg").html("<div>"+data.warning+"</div>"); 11 $("#msg").addClass("warn-msg");err=true;}else{if(data.success){$("#msg").html("<div>"+data.success+"</div>");}}}}if($("#msg").html()){$("#msg").show(300);}if(err){setTimeout(function(){$("#msg").hide(300);$("#msg").html("");},3000);}else{setTimeout(function(){$("#msg").hide(300);$("#msg").html("");},1500);}return !err;}function beforeAjaxSend(){$("#loading,#waiting").show();$("#waiting").animate({"opacity":"0.5"},300,"linear");}function ajaxComplete(){$("#loading,#waiting").hide();$("#waiting").animate({"opacity":"0"},300,"linear"); 12 }var opts={lines:25,length:25,width:5,radius:50,scale:1,corners:1,color:"#000",opacity:0.25,rotate:0,direction:1,speed:0.5,trail:60,fps:20,zIndex:2000000000,className:"spinner",top:"50%",left:"50%",shadow:false,hwaccel:false,position:"absolute"};var target,spinner,table;$("#registered-challenges,#upcoming-challenges,#past-challenges").DataTable({paging:false,searching:false});$(".tooltip-field").tooltip({show:{effect:"slideDown",delay:100},hide:{effect:"slideUp",delay:250}});dialog=$("#dialog-form").dialog({autoOpen:false,height:500,width:350,modal:true,buttons:{"Join Challenge":join_challenge,Cancel:function(){dialog.dialog("close"); 13 }},close:function(){form[0].reset();}});form=dialog.find("form").on("submit",function(event){event.preventDefault();join_challenge();});$("#join-challenge").button().on("click",function(){dialog.dialog("open");});$(".save").click(save_activity);$("#get-activity").click(get_my_activity);$("#msg").hide();if($("#loading")){target=document.getElementById("loading");spinner=new Spinner(opts).spin(target);}if($("#my-activity-body tr").length){table=$("#my-activity-table").DataTable({paging:false,buttons:["copyHtml5","csv","excel","pdf","print"],dom:"Bfrtip",searching:false,stripClasses:["odd-row","even-row"],order:[[0,"asc"],[2,"asc"]]}); 14 $(".fa-trash-alt").click(delete_activity);}}); -
point-tracker/trunk/public/partials/point-tracker-challenge-list-pg.php
r1924930 r1925352 39 39 ]); 40 40 } 41 42 $user = wp_get_current_user(); 41 43 42 44 $now = new DateTime("now", new DateTimeZone(get_option('timezone_string'))); … … 166 168 </table> 167 169 168 <?php } 170 <?php 171 } 169 172 173 ?> 174 175 176 <div id="dialog-form" title="Add new leader"> 177 <p class="validateTips">All form fields are required.</p> 178 179 <form> 180 <fieldset> 181 <input type="text" id="member-id" placeholder="Member ID..." 182 inputmode='numeric' pattern='[0-9]*' 183 class="text ui-widget-content ui-corner-all" /> 184 <input type="text" id="name" placeholder="Name..." value='<?php print $user->display_name; ?>' 185 class="text ui-widget-content ui-corner-all" /> 186 <input type='email' id='email' placeholder='Email...' value='<?php print $user->user_email; ?>' 187 class='text ui-widget-content ui-corner-all' /> 188 189 <!-- Allow form submission with keyboard without duplicating the dialog button --> 190 <input type="submit" tabindex="-1" 191 style="position: absolute; top: -1000px"> 192 </fieldset> 193 </form> 194 </div> 195 -
point-tracker/trunk/public/partials/point-tracker-challenge-pg.php
r1924930 r1925352 135 135 $inputmode = ($act->type == 'number' ? " inputmode='numeric' pattern='[0-9]*'" : null); 136 136 137 print "<label for='$id'>{$ques} <small>({$act->points} pts)</small></label><br />";138 137 print "<input type='{$act->type}' class='value' id='$id'$inputmode $min $max $val /> "; 139 138 } … … 210 209 $inputmode = ($act->type == 'number' ? " inputmode='numeric' pattern='[0-9]*'" : null); 211 210 212 print "<label for='$id'>{$ques} <small>({$act->points} pts)</small></label><br />";213 211 print "<input type='{$act->type}' class='value' id='$id'$inputmode $min $max $val /> "; 214 212 } -
point-tracker/trunk/public/partials/point-tracker-my-activity-pg.php
r1924930 r1925352 31 31 $user = wp_get_current_user(); 32 32 33 $wpdb->query($wpdb->prepare("SET @challenge_id=%d", $chal->id)); 34 $tp = $wpdb->get_var($wpdb->prepare("SELECT SUM(total_points) FROM {$wpdb->prefix}leader_board WHERE user_id = %d", $user->ID)); 35 33 36 $query = $wpdb->prepare("SELECT 34 37 ca.*,al.* … … 47 50 <input type='hidden' id='_wpnonce' value='<?php print wp_create_nonce('pt-delete-entry'); ?>' /> 48 51 <input type='hidden' id='chal' value='<?php print $chal->short_link; ?>' /> 52 <div id='tp'>Total Points: <span id='total-points'><?php print ($tp ? $tp : 0); ?></span></div> 49 53 <div id='left-half'> 50 54 <table id='my-activity-table' class="stripe">
Note: See TracChangeset
for help on using the changeset viewer.