Plugin Directory

Changeset 1925352


Ignore:
Timestamp:
08/15/2018 05:01:49 PM (8 years ago)
Author:
godsgood33
Message:

Bug fixes, readme.txt updates, and notice of conflict if Yoast SEO is installed and active

Location:
point-tracker
Files:
7 added
19 edited
11 copied

Legend:

Unmodified
Added
Removed
  • point-tracker/tags/1.1/README.txt

    r1924930 r1925352  
    11=== Plugin Name ===
    2 Plugin Name: Point Tracker
     2Point Tracker
    33Contributors: godsgood33
    4 Tags: team activities
     4Tags: team activities, challenge, content
    55Requires at least: 4.4.2
    66Requires PHP: 5.6
     
    1414== Description ==
    1515
    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.
     16This 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.
    2017
    2118== Installation ==
     
    26232. Activate the plugin through the 'Plugins' menu in WordPress
    27243. 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
     254. Navigate to the Point Tracker -> Point Tracker admin menu
     265. Fill out the form and create a challenge (add a name, start and end dates, and a description) then click "Save"
     276. Copy the link that appears just above the description box
     287. Navigate to the Point Tracker -> Activities admin menu
     298. Select the challenge you just created from the drop down
     309. Fill out the boxes and create your first activity for that challenge and click "Save"
     3110. Send the link to whomever you wish to get them to join
     3211. 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
    2933
    3034== Frequently Asked Questions ==
     
    4044The challenge will automatically approve all pending participants and any future participants will automatically be approved
    4145
     46= Once the challenge is over what happens? =
     47
     48You 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
     52You 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
     56One will be available in Point Tracker Pro releasing soon
     57
    4258== Screenshots ==
    4359
     
    45612. This is a screenshot of the Challenge editor
    46623. 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
     634. This is a screenshot of the Participant list
     645. This is a screenshot of the Entry log
     656. This is a screenshot of an example challenge and activities
     667. This is a screenshot of the "View My Activity" page after a test user has saved some activities
    4967
    5068== Changelog ==
     
    5371* Initial release
    5472
     73= 1.1 =
     74* Couple bug fixes
     75* Add screenshots
     76*
     77
    5578== Upgrade Notice ==
    5679
  • point-tracker/tags/1.1/admin/js/point-tracker-admin.min.js

    r1924930 r1925352  
    88}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>&nbsp;&nbsp;<i class='far fa-trash-alt' data-id='"+data.id+"'></i>"}).draw(false);
    99}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>");
    1313ret=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;
    1414}$.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  
    113113    $act = $wpdb->get_row($wpdb->prepare($query, $act_id, $chal_id));
    114114
     115    if(!$act) {
     116        print json_encode([
     117            'error' => 'Unable to find that activity'
     118        ]);
     119        wp_die();
     120    }
     121
    115122    $act->name = html_entity_decode($act->name, ENT_QUOTES | ENT_HTML5);
    116123    $act->desc = html_entity_decode($act->desc, ENT_QUOTES | ENT_HTML5);
  • point-tracker/tags/1.1/includes/ajax/participant-ajax.php

    r1924930 r1925352  
    2121    $chal_id = filter_input(INPUT_POST, 'chal-id', FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
    2222    $chal = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}pt_challenges WHERE id = %d", $chal_id));
    23    
     23
    2424    if(!$chal) {
    2525        print json_encode([
     
    302302    global $wpdb;
    303303
    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);
    305305    $member_id = filter_input(INPUT_POST, 'member-id', FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
    306306
    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);
    308308    $chal = $wpdb->get_row($query);
    309309
     
    315315    }
    316316
     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
    317320    $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     }
    326321
    327322    $res = $wpdb->insert("{$wpdb->prefix}pt_participants", [
     
    332327        'date_approved' => ($chal->approval ? null : $now->format("Y-m-d")),
    333328        '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    }
    341344
    342345    print json_encode($res ? [
  • point-tracker/tags/1.1/includes/class-point-tracker.php

    r1924930 r1925352  
    218218        $now = new DateTime("now", new DateTimeZone(get_option('timezone_string')));
    219219
    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) {
    221223            return null;
    222224        }
  • point-tracker/tags/1.1/public/class-point-tracker-public.php

    r1924930 r1925352  
    141141            wp_enqueue_script('jquery-ui-datepicker');
    142142            wp_enqueue_script('jquery-ui-tooltip');
     143            wp_enqueue_script('jquery-ui-dialog');
    143144
    144145            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);}});
     1jQuery(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);
     3return 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);
     4if($.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();
     5var 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>");
     9ret=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>");
     10ret=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  
    3939    ]);
    4040}
     41
     42$user = wp_get_current_user();
    4143
    4244$now = new DateTime("now", new DateTimeZone(get_option('timezone_string')));
     
    166168</table>
    167169
    168 <?php }
     170<?php
     171}
    169172
     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  
    135135            $inputmode = ($act->type == 'number' ? " inputmode='numeric' pattern='[0-9]*'" : null);
    136136
    137             print "<label for='$id'>{$ques} <small>({$act->points} pts)</small></label><br />";
    138137            print "<input type='{$act->type}' class='value' id='$id'$inputmode $min $max $val />&nbsp;&nbsp;";
    139138        }
     
    210209            $inputmode = ($act->type == 'number' ? " inputmode='numeric' pattern='[0-9]*'" : null);
    211210
    212             print "<label for='$id'>{$ques} <small>({$act->points} pts)</small></label><br />";
    213211            print "<input type='{$act->type}' class='value' id='$id'$inputmode $min $max $val />&nbsp;&nbsp;";
    214212        }
  • point-tracker/tags/1.1/public/partials/point-tracker-my-activity-pg.php

    r1924930 r1925352  
    3131    $user = wp_get_current_user();
    3232
     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
    3336    $query = $wpdb->prepare("SELECT
    3437    ca.*,al.*
     
    4750<input type='hidden' id='_wpnonce' value='<?php print wp_create_nonce('pt-delete-entry'); ?>' />
    4851<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>
    4953<div id='left-half'>
    5054    <table id='my-activity-table' class="stripe">
  • point-tracker/trunk/README.txt

    r1924930 r1925352  
    11=== Plugin Name ===
    2 Plugin Name: Point Tracker
     2Point Tracker
    33Contributors: godsgood33
    4 Tags: team activities
     4Tags: team activities, challenge, content
    55Requires at least: 4.4.2
    66Requires PHP: 5.6
     
    1414== Description ==
    1515
    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.
     16This 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.
    2017
    2118== Installation ==
     
    26232. Activate the plugin through the 'Plugins' menu in WordPress
    27243. 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
     254. Navigate to the Point Tracker -> Point Tracker admin menu
     265. Fill out the form and create a challenge (add a name, start and end dates, and a description) then click "Save"
     276. Copy the link that appears just above the description box
     287. Navigate to the Point Tracker -> Activities admin menu
     298. Select the challenge you just created from the drop down
     309. Fill out the boxes and create your first activity for that challenge and click "Save"
     3110. Send the link to whomever you wish to get them to join
     3211. 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
    2933
    3034== Frequently Asked Questions ==
     
    4044The challenge will automatically approve all pending participants and any future participants will automatically be approved
    4145
     46= Once the challenge is over what happens? =
     47
     48You 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
     52You 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
     56One will be available in Point Tracker Pro releasing soon
     57
    4258== Screenshots ==
    4359
     
    45612. This is a screenshot of the Challenge editor
    46623. 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
     634. This is a screenshot of the Participant list
     645. This is a screenshot of the Entry log
     656. This is a screenshot of an example challenge and activities
     667. This is a screenshot of the "View My Activity" page after a test user has saved some activities
    4967
    5068== Changelog ==
     
    5371* Initial release
    5472
     73= 1.1 =
     74* Couple bug fixes
     75* Add screenshots
     76*
     77
    5578== Upgrade Notice ==
    5679
  • point-tracker/trunk/admin/js/point-tracker-admin.min.js

    r1924930 r1925352  
    88}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>&nbsp;&nbsp;<i class='far fa-trash-alt' data-id='"+data.id+"'></i>"}).draw(false);
    99}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>");
    1313ret=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;
    1414}$.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  
    113113    $act = $wpdb->get_row($wpdb->prepare($query, $act_id, $chal_id));
    114114
     115    if(!$act) {
     116        print json_encode([
     117            'error' => 'Unable to find that activity'
     118        ]);
     119        wp_die();
     120    }
     121
    115122    $act->name = html_entity_decode($act->name, ENT_QUOTES | ENT_HTML5);
    116123    $act->desc = html_entity_decode($act->desc, ENT_QUOTES | ENT_HTML5);
  • point-tracker/trunk/includes/ajax/participant-ajax.php

    r1924930 r1925352  
    2121    $chal_id = filter_input(INPUT_POST, 'chal-id', FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
    2222    $chal = $wpdb->get_row($wpdb->prepare("SELECT * FROM {$wpdb->prefix}pt_challenges WHERE id = %d", $chal_id));
    23    
     23
    2424    if(!$chal) {
    2525        print json_encode([
     
    302302    global $wpdb;
    303303
    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);
    305305    $member_id = filter_input(INPUT_POST, 'member-id', FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
    306306
    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);
    308308    $chal = $wpdb->get_row($query);
    309309
     
    315315    }
    316316
     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
    317320    $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     }
    326321
    327322    $res = $wpdb->insert("{$wpdb->prefix}pt_participants", [
     
    332327        'date_approved' => ($chal->approval ? null : $now->format("Y-m-d")),
    333328        '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    }
    341344
    342345    print json_encode($res ? [
  • point-tracker/trunk/includes/class-point-tracker.php

    r1924930 r1925352  
    218218        $now = new DateTime("now", new DateTimeZone(get_option('timezone_string')));
    219219
    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) {
    221223            return null;
    222224        }
  • point-tracker/trunk/public/class-point-tracker-public.php

    r1924930 r1925352  
    141141            wp_enqueue_script('jquery-ui-datepicker');
    142142            wp_enqueue_script('jquery-ui-tooltip');
     143            wp_enqueue_script('jquery-ui-dialog');
    143144
    144145            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);}});
     1jQuery(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);
     3return 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);
     4if($.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();
     5var 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>");
     9ret=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>");
     10ret=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  
    3939    ]);
    4040}
     41
     42$user = wp_get_current_user();
    4143
    4244$now = new DateTime("now", new DateTimeZone(get_option('timezone_string')));
     
    166168</table>
    167169
    168 <?php }
     170<?php
     171}
    169172
     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  
    135135            $inputmode = ($act->type == 'number' ? " inputmode='numeric' pattern='[0-9]*'" : null);
    136136
    137             print "<label for='$id'>{$ques} <small>({$act->points} pts)</small></label><br />";
    138137            print "<input type='{$act->type}' class='value' id='$id'$inputmode $min $max $val />&nbsp;&nbsp;";
    139138        }
     
    210209            $inputmode = ($act->type == 'number' ? " inputmode='numeric' pattern='[0-9]*'" : null);
    211210
    212             print "<label for='$id'>{$ques} <small>({$act->points} pts)</small></label><br />";
    213211            print "<input type='{$act->type}' class='value' id='$id'$inputmode $min $max $val />&nbsp;&nbsp;";
    214212        }
  • point-tracker/trunk/public/partials/point-tracker-my-activity-pg.php

    r1924930 r1925352  
    3131    $user = wp_get_current_user();
    3232
     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
    3336    $query = $wpdb->prepare("SELECT
    3437    ca.*,al.*
     
    4750<input type='hidden' id='_wpnonce' value='<?php print wp_create_nonce('pt-delete-entry'); ?>' />
    4851<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>
    4953<div id='left-half'>
    5054    <table id='my-activity-table' class="stripe">
Note: See TracChangeset for help on using the changeset viewer.